Behaviour for HTTP adapters — swap Finch for test mocks.
@type body() :: String.t() | nil
@type headers() :: [{String.t(), String.t()}]
@type method() :: :get | :post | :put | :patch | :delete
@type response() :: {:ok, %{status: integer(), headers: headers(), body: String.t()}} | {:error, term()}
@callback request(method(), String.t(), headers(), body(), keyword()) :: response()