"default_hook" should also have an entry for 'request' (to deal with allow_redirect=True)

When using allow_redirect=True, user can set a callback on each 'response' (via the hook parameter) but not on 'request'. 
This is a problem when using the redirect capability because user loose the ability to interact with the request before it is being sent.
This would allow a user to do things such as: Log all incoming requests (and all redirect) in real time / modify the header between redirected calls / modify argument or payload between calls / or change http method between redirects / ... 

Locally I can fix this by changing:
* hook.py: 
    - Adding a 'request' to the HOOK list at line 14: 
        HOOKS = ['response', 'request'])
* Session.py
    - move line 637 to 633:
        hook = request.hooks
    - add a callback line 634:
        dispatch_hook('request', hooks, request, **kwargs)

But I don't want to have a frankenversion of "requests.py" on my system. And I'm not familiar enough to have a good "proposed change" from GitHub (without potentially causing unintended side effects).


## Expected Result
The 'response' hook should be triggered just before making the adapter.send (initially and more importantly for all subsequent redirects).
The default_hook (hook.py) should have an entry for 'request' along with 'response'

## Actual Result
When redirect happen, mulitple 'response' callback are triggered but no 'request' callback.

What happened instead.

## Reproduction Steps

```python
import requests

LOG = logging.getLogger(__name__)    

# ( in real scenario, there would be something more interesting than logging here - but good enough for repro steps).
def _log_request(self, prepared_request):
    LOG.info("HTTP Request")           
    LOG.info("-> %s %s" % (prepared_request.method.upper(), prepared_request.url))           
    if prepared_request.body:
        LOG.info("-> (Payload) %s" % prepared_request.body)
    for key,value in prepared_request.headers.items():
        LOG.info("-> %s: %s" % (key,value))

def _log_response(self, resp):
    LOG.info("HTTP Response for '%s'" % resp.url)
    LOG.info("<- Status Code = %s" % resp.status_code)
    for (key,value) in resp.headers.items():
        LOG.info("<- %s: %s" % (key,value) )

session = requests.Session()
session.get(url, headers=_headers, hooks={"response":_log_response, "request":_log_request}, allow_redirects=True)
```

## System Information

    $ python -m requests.help

```
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.7"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.5"
  },
  "platform": {
    "release": "17.7.0",
    "system": "Darwin"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.19.1"
  },
  "system_ssl": {
    "version": "100020ef"
  },
  "urllib3": {
    "version": "1.23"
  },
  "using_pyopenssl": false
}


```

This command is only available on Requests v2.16.4 and greater. Otherwise,
please provide some basic information about your system (Python version,
operating system, &c).


Resolving this as a duplicate of #5037.