[engine] Allow injecting of intrinsic providers to ease testing

Review Request #4263 — Created Sept. 26, 2016 and submitted — Latest diff uploaded

kwlzn, stuhood, yujiec

It's currently a little hard to test the interactions between task rules and intrinsics because they are injected directly by the NodeBuilder. This change allows the intrinsic providers
to be overridden for testing.

I also added an error condition if two intrinsics have the same key.

It seems a little big, but that's mostly due to the moving of the intrinsic rule class declarations.

CI passed at https://travis-ci.org/pantsbuild/pants/builds/162879047, I ran engine tests locally.