Push group handling into GroupTask.

This eliminates knowledge of groups from the core Engine
implementations and isolates their handling to a specialized
GroupTask that delegates to GroupMembers each producing the
same product type.

This also eliminates the trace of groups in every Task's
execute signature which now no-longer takes targets.  Tasks
instead get the targets they need from the context uniformly.

Finally, a prepare lifecycle method is added to the base task
interface.  Today this is called lockstep after the contructor
by the core engine, but in the future it will be where things
like product requirements are registered.

https://rbcommons.com/s/twitter/r/431/