A convenient pattern: given a request (in an open union), either
handle it (using default Handler) or relay it.
Handle implies that all requests of type
t are dealt
with, i.e.,
k (the response type) doesn't have
t as
part of its effect list. The
Relay k r constraint ensures
that
k is an effectful computation (with effectlist
r).
Note that we can only handle the leftmost effect type (a consequence
of the
OpenUnion implementation.