@type callback() :: {module(), func :: atom(), args :: list()}
@type message() :: term()
@opaque realm()
@callback handle_request(message(), realm(), state :: term()) :: {result :: term(), new_state :: term()} | {result :: term(), new_state :: term(), new_realm :: realm()}
@spec register(realm(), callback() | module()) :: realm()
@spec request( {module(), message()}, realm() ) :: {:ok, result :: term(), realm()} | {:error, reason :: term()}