Support specifying adapter per-request

Currently, the only way an adapter can be applied is by mounting into a Session. It would be great to add something like `http_adapter` as an argument to the `.get()`/`.post()` functions.

In our project, we need to retry all idempotent requests, but we have some RPC-endpoints (e.g. a GraphQL endpoint) that uses `POST` even for idempotent requests. So we need some way of specifying that a particular request is idempotent and should be retried.

Alternatively, this can be achieved by being able to specify a predicate in `Session.mount` that takes in a `Request` and returns `True` if this mounted adapter should be used. But specifying the adapter directly in the `.get()`/`.post()` functions would be better, so that the logic of "should i retry?" is on the actual request instead of centralized in one location

Our current workaround:
```python
class MyAdapter(HTTPAdapter):
    """Requests transport adapter that retries requests when activated."""

    def __init__(self, *args, **kwargs):
        max_retries = kwargs.pop("max_retries", None)

        super().__init__(*args, **kwargs)

        self._retry_next_request = False

        if max_retries:
            self._max_retries = Retry.from_int(max_retries)

    def activate_once(self):
        self._retry_next_request = True

    def send(self, request, *args, **kwargs):
        if not self._retry_next_request:
            return super().send(request, *args, **kwargs)

        old_max_retries = self.max_retries
        self.max_retries = self._max_retries

        try:
            result = super().send(request, *args, **kwargs)
        finally:
            self._retry_next_request = False

        self.max_retries = old_max_retries
        return result

session = requests.Session()
adapter = MyAdapter(max_retries=...)
session.mount("http://", adapter)
session.mount("https://", adapter)

# this is retried
adapter.activate_once()
session.post(...)

# this is not retried
session.post(...)
```

You can specify which domains are used for an adapter. See this hastily thrown together example:

```
Python 3.9.5 (default, May 14 2021, 00:00:00)
[GCC 11.1.1 20210428 (Red Hat 11.1.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> s = requests.Session()
>>> print(requests.adapters.HTTPAdapter)
<class 'requests.adapters.HTTPAdapter'>
>>> class MyAdapter(requests.adapters.HTTPAdapter):
...   def send(self, *args, **kwargs):
...     print("Hello!")
...     super().send(*args, **kwargs)
...
>>> a = MyAdapter()
>>> s.mount("https://httpbin.org", a)
>>> s.get("https://example.com").status_code
200
>>> s.get("https://httpbin.org/get").status_code
Hello!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/site-packages/requests/sessions.py", line 555, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python3.9/site-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3.9/site-packages/requests/sessions.py", line 659, in send
    r.elapsed = timedelta(seconds=elapsed)
AttributeError: 'NoneType' object has no attribute 'elapsed'
>>>
```

It's prefix matching here. As an aside, there is an ability to directly override several of the methods on a Session responsible for handling redirects at the moment. It's not well-documented because it isn't an oft-needed feature and most people seem to have been able to puzzle it out themselves. Adapters aren't quite the right level for this.

There's also a method for using urllib3's Retry logic in Requests which _is_ documented and might suite you better

Thanks for the quick response!

I don't think prefix matching is sufficient for our use-case. Our use-case is a single endpoint (e.g. `POST example.com/graphql`) where different request bodies should be retried, but others shouldn't.

We are using urllib3's Retry logic, but that's not sufficient either, because there's no hook for "use these retry options for a request where the body satisfies some predicate, and use these other retry options if not"