Move the task execution machinery to the Task object, so that Tasks can execute independently of an Executor. The Executor instance now just manages task lists and schedules when tasks are supposed to run.

Report progress updates by pushing information to the SteppedProgressManager? instance associated with each erasure target. Furthermore, do not manipulate the state of the Task object, instead, let the Task object manage its own Progress state.