@type result_t() :: struct() | map()
@type t() :: module()
@callback is_unmarshable?(bitstring(), boolean()) :: boolean()
@callback unmarshal(bitstring(), boolean()) :: {:ok, result_t()} | {:error, any()}