Behaviour for HTTP client implementations.
@type body() :: binary() | {:multipart, list()}
@type error() :: %{reason: atom() | String.t(), message: String.t()}
@type headers() :: [{String.t(), String.t()}] | %{required(String.t()) => String.t()}
@type response() :: %{status: integer(), headers: headers(), body: binary()}
@callback get(url :: String.t(), headers :: headers()) :: {:ok, response()} | {:error, error()}
@callback post(url :: String.t(), body :: body(), headers :: headers()) :: {:ok, response()} | {:error, error()}