Handle IO exceptions "within" our monad stack

Essentially, we're using monad-control and enclosed-exceptions to
catch IO exceptions and wrap them in the ExceptT which forms part of
the custom monad. This will help structure the handlers, etc. better.
Revise schema column types slightly