Tweaked the generics on DirectedGraph.
- Changed the ExecutionFailure implementations to match the whole problem description, allowing descriptions that span multiple lines.
- Tightened up the OutputScrapingExecutionFailure output checking to do a better job of extracting the details out of the error output.
- Changed the InProcessExcecutionFailure to also delegate to an output scraping implementation, to verify that the details are present both in the exception chain and the logging output.
Added DirectedGraphRenderer, which can render a graph as a tree. Use this in DefaultTaskExecutionPlan to display the task cycle as a tree,