Refactor the engine to build the phase graph recursively via requesting
products: RoundEngine
Related issue: https://github.com/pantsbuild/pants/issues/247

Was driven by:
https://github.com/pantsbuild/pants/issues/152

The "idea" goal is special since it requires a compile of a sub-graph of
the overall Target graph followed by a gen on the entire graph.
Currently, there is no non-hacky way of specifying a specific section of
the Target graph to be passed to a specific task.

This refactor, aims to extract out the scheduling of Tasks and their
dependencies from register.py (where its been traditionally stored) and
be able to pass through a Target graph if/when required. No matter what
order goals are specified in the register.py, their order is overwritten
by the prepare()/product_type() pairing.

This change is for building the phase graph recursively via requesting
products in prepare(..) and advertising products via a Task classmethod
product_type().