Have tasks be able to provide copy() methods

When a engine needs to copy a task and possibly
adjust its listeners to execute it elsewhere it
needs to be able to clone that object and have
the clone retain different properties than the
initial object; so in order to support this at
a top-level we require a new copy() method which
a task can override (or it can just use the default
implementation if it chooses to).

Part of blueprint process-executor

Change-Id: Ib29a0afdc01973eb94d41af18a9b04601cd2f152
Merge "Have tasks be able to provide copy() methods"