Runs an action that requires additional capabilities.
derive @t @derived @ambient act runs act by providing both the
capabilities in derived and ambient. The difference is that ambient
capabilities are assumed to be available, whereas derived instances are
provided by t.
derive assumes that t is a newtype defined in the form:
newtype T m a = T (m a)
Then derive uses type-class instances for T to provide for each of the
capabilities in derived.
A common instance of this is wrapError, whereby exceptions
raised by act can be repackaged in a larger exception type.
The derive function is experimental and is subject to change.