Implement task dependencies
Tasks should have "hard" and "soft" dependencies.
- The task should throw an exception if any of its hard dependencies returns FALSE for isCompleted(), unless a
force
option is in effect. - When multiple tasks are retrieved, they should be ordered by all their dependencies, throwing an exception if the dependencies are circular.