Generalized abstracted pattern of safe resource acquisition and
release in the face of errors. 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 error is thrown during the use, the release still happens before
the error is rethrown.
Note that this is essentially a type-specialized version of
generalBracket. This function has a more common signature
(matching the signature from
Control.Exception), and is often
more convenient to use. By contrast,
generalBracket is more
expressive, allowing us to implement other functions like
bracketOnError.