Getting ProxyError exception out of ConnectionError 

When a request is made via proxy and a timeout happens you'll get a `ConnectTimeout` error, which is expected:

``` python
import requests

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

try:
    requests.get(
        'http://httpbin.org/ip', proxies=proxies, timeout=1
    ).json()
except requests.ConnectionError as e:
    print(isinstance(e, requests.exceptions.ConnectTimeout))  # true
```

I believe this is possible because of "special handling" here on [these lines](https://github.com/kennethreitz/requests/blob/master/requests/adapters.py#L429-L432).

However, if the proxy cause a `Network unreachable` /  `No route to host` error, [you'll get](https://github.com/kennethreitz/requests/blob/master/requests/adapters.py#L437) a "generic" `ConnectionError`, not a specific `ProxyError` and there is actually no way to get to the `ProxyError`.

> ConnectionError(MaxRetryError("HTTPConnectionPool(host='10.10.1.10', port=3128): Max retries exceeded with url: http://httpbin.org/ip (Caused by ProxyError('Cannot connect to proxy.', NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x10fe268d0>: Failed to establish a new connection: [Errno 51] Network is unreachable',)))",),)

The question is: is it possible to get somehow down to, at least, `ProxyError` in this case?


And yeah, in first place, thanks for great library, @kennethreitz and all the contributors :+1: 


@alexanderad The `ProxyError` you see in that traceback is actually a urllib3 `ProxyError` class. If we wanted to try to abstract the `ProxyError` out we could in principle do that, and it looks like the same change that we had to work around for the timeout error we also have to workaround for the `ProxyError`. 

A pull request to fix this should be fairly simple: do you want to tackle it @alexanderad?


@Lukasa I think I can take a look and provide a patch, thanks for the confirmation. I see some `ProxyError` handling on lines https://github.com/kennethreitz/requests/blob/master/requests/adapters.py#L442-L443, need to take closer look what _that_ `ProxyError` refers to in it's original purpose and why we don't see it in this case (perhaps it comes from system-wide configured proxy?)


@alexanderad So you can work out why we don't see it in this case by looking at the exception itself, which is a nested collection of ever-lower-level exceptions, which you can see more clearly here

```
ConnectionError(
    MaxRetryError(
        "HTTPConnectionPool(host='10.10.1.10', port=3128): Max retries exceeded with url: http://httpbin.org/ip (Caused by 
            ProxyError('Cannot connect to proxy.', 
                NewConnectionError(': Failed to establish a new connection: [Errno 51] Network is unreachable',)
            )
        )",
    ),
)
```

So the specific problem is that this _kind_ of `ProxyError` now causes a `MaxRetryError`, where previously it did not. So we just need some error handling code in the `MaxRetryError` branch to look for a `ProxyError` in the `reason`, and reraise appropriately.

Given that `ProxyError` is a subclass of `ConnectionError`, this change should be non-breaking.


Thanks, I'll take care of this.


Fixed in #3059