Refactored DefaultTaskExecutionPlan to use TaskDependencyGraph to determine execution plan
Added 'must run after' task ordering
Order buildDashboard tasks to always run after reporting tasks
Do not track nodes without incoming edges in TaskDependencyGraph and use added tasks as entry points to execution plan in DefaultTaskExecutionPlan
Simplify adding graph nodes and edges
Differentiate between soft and hard edges in TaskDependencyGraph
Add mustRunAfter dependencies before regular dependencies to execution plan, continue execution of task with must run after dependency if the dependee task fails
Reduce number of task lookups in graph
Merged TaskInfo and TaskDependencyGraphNode
Determine executionPlan only after all tasks are added
Lazy evaluation of must run after dependencies
Add user nagging for Task.setMustRunAfter(Iterable)
Use NON_REQUIRED state in TaskInfo instead of required field and remove executionDependencies field
Add docs around mustRunAfter