@type callback() :: {module(), func :: atom(), args :: list()}
@type message() :: term()
@opaque realm()
@type request_info() :: {timestamp(), realm()}
@type timestamp() :: pos_integer()
@callback handle_request(message(), request_info(), 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()}, timestamp(), realm()) :: {result :: term(), realm()}