Shell::runCommand is now responsible for delegating out to tasks and correctly checking methods to run. ShellDispatcher no longer parses parameters and instead only pulls out the path information that it needs to setup the environment.
This allows task initialization to be moved out of ShellDispatcher where it does not belong, as tasks are similar to components. Updating parts of TaskCollection, as the Dispatcher is still required to be passed around.
Adding MissingShellMethodException, MissingShellClassException and MissingShellFileException for use with ShellDispatcher.
Removing duplicated tests, and refactoring them into separate tests with expected exceptions.