Abstract over MonadIO

This generalizes the whole public API (and a good part of private one) on `MonadIO`. This should be profiled/benchmarked and some functions should be `SPECIALIZE`'d -- I haven't done this yet. This also makes `Draw` a monad transformer -- if this is not desired, I can revert this part.