A monad that can catch exceptions. A minimal definition
requires a definition of gcatch.

Implementations on top of IO should implement gblock and gunblock to
eventually call the primitives block and
unblock respectively. These are used for
implementations that support asynchronous exceptions. The default
implementations of gbracket and gfinally use gblock and gunblock
thus rarely require overriding.