This module supports monads that can throw extensible exceptions. The
exceptions are the very same from Control.Exception, and the operations
offered very similar, but here they are not limited to IO.

This code is in the style of both transformers and mtl, and is compatible
with them, though doesn't mimic the module structure or offer the complete
range of features in those packages.

This is very similar to ErrorT and MonadError, but based on features of
Control.Exception. In particular, it handles the complex case of
asynchronous exceptions by including mask in the typeclass. Note that the
extensible extensions feature relies the RankNTypes language extension.

Provide a handler for exceptions thrown during execution of the first
action. Note that type of the type of the argument to the handler will
constrain which exceptions are caught. See Control.Exception's
catch.

Like mask, but the masked computation is not interruptible (see
Control.Exception's uninterruptibleMask. WARNING:
Only use if you need to mask exceptions around an interruptible operation
AND you can guarantee the interruptible operation will only block for a
short period of time. Otherwise you render the program/thread unresponsive
and/or unkillable.

Generalized abstracted pattern of safe resource acquisition and release
in the face of exceptions. The first action "acquires" some value, which
is "released" by the second action at the end. The third action "uses"
the value and its result is the result of the bracket.

If an exception occurs during the use, the release still happens before the
exception is rethrown.