Using "no_proxy" by default HTTPAdapter

Although feature with "no_proxy" key are not documented yet there is a validation method `(requests.utils.should_bypass_proxies)` for it. Unfortunately method for matching url in "no_proxy" list is not used by default. This is a bug or a feature?
```
s = requests.Session()
    r = requests.Request(url='http://127.0.0.2').prepare()
    s.send(r, proxies={
            'http': 'http://127.0.0.1:8090',
            'no_proxy': '127.0.0.2',
        },
    )
```


## Expected Result

Send method will not use proxy due to url  in "no_proxy" list.

## Actual Result

Send method will still use proxy and ignore "no_proxy".

Reproduction steps above.

System info:
```
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.6"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.2"
  },
  "platform": {
    "release": "17.2.0",
    "system": "Darwin"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "100020ef"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": false
}
```

It's possible declare own Adapter and call method for checking no_proxy like this manner:
```
import requests
 
def select_proxy(url, proxies):
    """Select a proxy for the url, if applicable.
 
    :param url: The url being for the request
    :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs
    """
    proxies = proxies or {}
    urlparts = requests.utils.urlparse(url)
    if urlparts.hostname is None:
        return proxies.get(urlparts.scheme, proxies.get('all'))
 
    proxy = None
    if requests.utils.should_bypass_proxies(url, proxies.get('no_proxy')):
        return proxy
 
    proxy_keys = [
        urlparts.scheme + '://' + urlparts.hostname,
        urlparts.scheme,
        'all://' + urlparts.hostname,
        'all',
    ]
 
    for proxy_key in proxy_keys:
        if proxy_key in proxies:
            proxy = proxies[proxy_key]
            break
 
    return proxy
 
 
class NoProxyAdapter(requests.adapters.HTTPAdapter):
    def get_connection(self, url, proxies=None):
        """Returns a urllib3 connection for the given URL. This should not be
        called from user code, and is only exposed for use when subclassing the
        :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
 
        :param url: The URL to connect to.
        :param proxies: (optional) A Requests-style dictionary of proxies used on this request.
        :rtype: urllib3.ConnectionPool
        """
        proxy = select_proxy(url, proxies)
 
        if proxy and proxy not in proxies.get('no_proxy', []):
            proxy = requests.adapters.prepend_scheme_if_needed(proxy, 'http')
            proxy_manager = self.proxy_manager_for(proxy)
            conn = proxy_manager.connection_from_url(url)
        else:
            # Only scheme should be lower case
            parsed = requests.adapters.urlparse(url)
            url = parsed.geturl()
            conn = self.poolmanager.connection_from_url(url)
 
        return conn
 
 
if __name__ == "__main__":
    s = requests.Session()
    s.mount('http://', NoProxyAdapter())
    r = requests.Request(url='http://127.0.0.2').prepare()
    s.send(
        r,
        proxies={
            'http': 'http://127.0.0.1:8090',
            'no_proxy': '127.0.0.2',
        },
    )

```

This code works correctly for me and use "no_proxy". All difference is this two lines in function select_proxy:
```
    if requests.utils.should_bypass_proxies(url, proxies.get('no_proxy')):
        return proxy
```


Hey @jejefferson, thanks for opening this issue. I took a quick look and this functionality was mostly implemented in #3865. The original PR added something similar to what you're asking but it was to `rebuild_proxies`, which means it only runs on redirects. Your first request won't hit this, so that likely explains the gap you're seeing.

I'm not convinced we want to patch this at the adapters level, but if you can put together a failing test that shows this behaviour, we can likely work a solution from there. Let us know if you have any questions. Thanks!

In an effort to clean up the issue tracker to only have issues that are still relevant to the project we've done a quick pass and decided this issue may no longer be relevant for a variety of potential reasons, including:

* Applies to a much older version, unclear whether the issue still applies.
* Change requires a backwards incompatible release and it's unclear if the benefits are worth the migration effort from the community.
* There isn't a clear demand from the community on the change landing in Requests.

If you think the issue should remain open, please comment so below or open a new issue and link back to the original issue. Again, thank you for opening the issue and for the discussion, it's much appreciated.