put executeInstallPlan into newly created Shell monad (#975)

This commit puts `executeInstallPlan` into a newly created `Shell` Monad, which tracks the status of the parallel install. It should be trivial to implement #975 by tweaking `Distribution.Client.Shell`. I realize this is quite a big change which also adds a dependency on `exceptions`, so I'd appreciate a review before this is merged.

commit messages follows:

The Shell monad is basically an IO monad which carries around the state
of the parallel install. It is an instance of MonadIO but you print output
through with special commands warn', notice', info', etc which will in the
future be redirected to write a nice UI.

Shell can also 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).
So it'd be nice to somehow indicate that this code still works if the underlying compiler is different.