put executeInstallPlan into newly created Shell monad (#975)

The Shell monad is basically an IO monad where you print output to the terminal
through with special commands warn', notice', info', etc. It is an instance of
MonadIO but you must not use this to print to the terminal.

Shell can be forked with forkIO'.

This adds dependencies on transformers (which was already implied by the mtl
dependency) and exceptions (which is new but has no additional dependencies).

This commit does the boring liftIO stuff, and puts Verbosity in Shell
as a ReaderT-like value. The commands warn', notice', info', etc are just
wrappers around the old values.
add info/notice/warn/debug/die logging to Shell (#975)
Shell tracks package-level progress in parallel builds (#975)

This only uses existing cabal machinery to track package-level progress.
Nothing here tracks module-level progress.
add module-level progress to Shell (#975)

Because we call ghc --make, I am making a sort of tee and parsing
the output for package-level progress. Parse failures are handled
as described in the comments on `parseBuildLine`