Misleading exception with invalid protocol in proxy variable

When the value of `https_proxy` or `HTTPS_PROXY` variable(s) accidentally miss one '/' in the protocol, a traceback is thrown to the user which doesn't pin point that the issue is with the proxy configuration.

## Expected Result

A better exception

## Actual Result

An exception which doesn't pin point exactly what went wrong.

## Reproduction Steps
```
(req2) nwani@dockerub01:~/requests$ export https_proxy=http:/my.proxy.com:3128
(req2) nwani@dockerub01:~/requests$ python -c "import requests; requests.get('https://google.com')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/nehaljwani/requests/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/home/nehaljwani/requests/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/nehaljwani/requests/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/nehaljwani/requests/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/home/nehaljwani/requests/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/home/nehaljwani/m3/envs/req2/lib/python3.6/site-packages/urllib3-1.22-py3.6.egg/urllib3/connectionpool.py", line 595, in urlopen
    self._prepare_proxy(conn)
  File "/home/nehaljwani/m3/envs/req2/lib/python3.6/site-packages/urllib3-1.22-py3.6.egg/urllib3/connectionpool.py", line 816, in _prepare_proxy
    conn.connect()
  File "/home/nehaljwani/m3/envs/req2/lib/python3.6/site-packages/urllib3-1.22-py3.6.egg/urllib3/connection.py", line 284, in connect
    conn = self._new_conn()
  File "/home/nehaljwani/m3/envs/req2/lib/python3.6/site-packages/urllib3-1.22-py3.6.egg/urllib3/connection.py", line 141, in _new_conn
    (self.host, self.port), self.timeout, **extra_kw)
  File "/home/nehaljwani/m3/envs/req2/lib/python3.6/site-packages/urllib3-1.22-py3.6.egg/urllib3/util/connection.py", line 51, in create_connection
    if host.startswith('['):
AttributeError: 'NoneType' object has no attribute 'startswith'
```

## System Information

```
(req2) nwani@dockerub01:~/requests$ python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.6"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.3"
  },
  "platform": {
    "release": "4.4.0-93-generic",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "100020cf"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": false
}
```

I am not sure what is the correct place to fix this. Should the fix/check be in requests, urllib3, or urlparse?

On dumping the connection object right before calling `conn.urlopen()`, the output for `print(vars(conn))` reveals:
```
'proxy': Url(scheme='http', auth=None, host=None, port=80, path='/my.proxy.com:3128', query=None, fragment=None), 
```
And this makes urllib3 think that the proxy to be reached is: `http://:80/my.proxy.com:3128`

requests calls `prepend_scheme_if_needed()` in the function `get_connection()` and in this case changes the url to http:///my.proxy.com:3128
```
>>> from requests.utils import prepend_scheme_if_needed 
>>> prepend_scheme_if_needed("https:/myproxy.com:3128", "http")
'https:///myproxy.com:3128'
```
... which when passed to parse_url() from `urllib3.util`:
```
>>> from urllib3.util import parse_url
>>> parse_url("https:///myproxy.com:3128")
Url(scheme='https', auth=None, host=None, port=None, path='/myproxy.com:3128', query=None, fragment=None)
```
... makes the host and port vanish.

Yeah, we could maybe have a specific check for a not `None` `host` value, but there's nothing actually wrong in what we're doing. Further, urllib3 is parsing the URI you're providing it, correctly. The authority portion of a URI begins with `//` and contains the userinfo, host, and port. Paths begin with `/` and come after an `authority` or after the scheme which is terminated by `:`. So your typo is actually a valid URI. It just doesn't have an authority section.

So, like I said, we could provide a more understandable exception but in reality, this is RFC 3986 working against you (as well as the fact that we implement it correctly).

Sure, but semantically speaking, an empty `authority` section doesn't make sense for a proxy URI right?

@nehaljwani exactly. This is why I suggest checking for that and raising a more helpful/understandable exception.

> This is why I suggest checking for that and raising a more helpful/understandable exception.

That would be great.  Otherwise, at the level of a using requests as a library for another application, I think we're forced into [something like](https://github.com/conda/conda/pull/6205/files)

```python
except AttributeError as e:
    if text_type(e) == "'NoneType' object has no attribute 'startswith'":
        raise ProxyError()
    else:
        raise
```

@sigmavirus24 If someone were to submit a PR, is 

https://github.com/requests/requests/blob/81b63419cbd8a6f0c9c2b79083d25dc2260156e3/requests/exceptions.py#L36-L37

the correct exception to raise?  Or should a new exception be created, something like

```python
class InvalidProxy(RequestException, ValueError):
    """The proxy value provided was somehow invalid."""
```

@kalefranz I've already opened a PR at https://github.com/requests/requests/pull/4356

Hey @kalefranz, ProxyError should be sufficient for our needs here. We have an open PR (#4356) which is currently addressing this.

Just saw #4356! Apologies for the noise.