A request that succeeds with A, fails with E and needs the
services R. Subclass it as a frozen dataclass, so equal requests
compare equal (with_cache and grouping rely on it)::
@dataclass(frozen=True)
class GetUser(fx.Request[User, NotFound]):
id: int