Allows jobs to be cancelled. A cancelled job will not do any processing, but otherwise behaves normally, i.e. notifying dependents when it 'completes'. The JobCancelGroup a Job belongs to can be specified when the Job is created. JobCancelGroups can be arranged in a tree structure, then cancelling a parent group will also cancel all the child groups.
JobCancelGroups are not deleted by the system, the user must manage their lifetimes. They must not be deleted until their associated jobs have completed.
Note: These groups are needed because the existing dependency tree goes the wrong direction for cancellation. We need the ability to cancel an entire tree of work at once, this could be done by cancelling the 'join' job, but then the 'fork' jobs would need to check their entire dependency chain to see if they themselves should be cancelled.