Serialization boundary for request/response payloads.
@callback decode(binary(), term() | nil, keyword()) :: {:ok, term()} | {:error, term()}
@callback encode(term(), keyword()) :: {:ok, binary()} | {:error, term()}