[Haskell-cafe] Wrapping the IO monad to get safe, self-describing imperative APIs