richer semantics for DynamicTasks.waitForLast
Duration can return null (useful for contexts where 'forever' is meant by null)
support swallowing failures in DynamicSequentialTask, and make sure stop does this, including new test for cases where stop failed when process refused to stop
cleaner way to capture failure in stop, part 1
cleaner way to capture stop failures, part 2 - we can let intermediate tasks fail, then manually kick off subsequent tasks.
significant changes to how the queue for DynamicSequentialTask instances is drained, clearer API with no need to cancel unsubmitted tasks.
stop-process swallows failure, but stop now throws if process fails, due to DST checking children even if secondaryJobMaster.isDone()  - part 3
now we swallow failures within the task itself, and some care to capture and propagate the failure, so we resolve the asymmetry between stop-process children failing and stop-process itself failing, but what we really want to do is specify that certain children tasks are allowed to fail (coming in next part); this is part 4
finally, stop-process failures don't break stop if the machine is destroyed, and don't stop restart, because we have ability to mark a task as inessential meaning it won't cause its parent to fail - part 5