An attempt to break up the monolithic IO monad into small, composable classes
that can be used to restrict a function to only having access to, say, functions
to work with the standard pipes, or a function that can access the environment.
The motivation for this library is to allow people to make a stricter contract
than simply this function does IO, and express through the type system exactly
what IO is being performed.