POST of urlencoded data breaks HTTPSignatureAuth

`HTTPSignatureAuth` doesn't work with POST and the `application/x-www-form-urlencoded` content type.

https://github.com/requests/requests/blob/e4fc3539b43416f9e9ba6837d73b1b7392d4b242/requests/models.py#L105

The `urlencode()` invocation in the line above returns a `str`, which is then assigned to the `body` attribute of the `PreparedRequest` instance. I think `HTTPSignatureAuth` expects the body to be `bytes`.




## Expected Result

Request is made.

## Actual Result

```
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests/api.py", line 112, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests/sessions.py", line 494, in request
    prep = self.prepare_request(req)
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests/sessions.py", line 437, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests/models.py", line 309, in prepare
    self.prepare_auth(auth, url)
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests/models.py", line 540, in prepare_auth
    r = auth(self)
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests_http_signature/__init__.py", line 89, in __call__
    self.add_digest(request)
  File "/Users/hannes/workspace/hca/data-store/wip/.venv/lib/python3.6/site-packages/requests_http_signature/__init__.py", line 69, in add_digest
    digest = self.hasher_constructor(request.body).digest()
TypeError: Unicode-objects must be encoded before hashing
```
## Reproduction Steps

```python
import requests
import requests_http_signature
auth = requests_http_signature.HTTPSignatureAuth(key=b'123', key_id='foo')
requests.post('http://localhost/', data={'foo':'bar'}, auth=auth)
```

## System Information

    $ python -m requests.help

```
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.6"
  },
  "implementation": {
    "name": "CPython",
    "version": "3.6.4"
  },
  "platform": {
    "release": "17.4.0",
    "system": "Darwin"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.18.4"
  },
  "system_ssl": {
    "version": "100020ef"
  },
  "urllib3": {
    "version": "1.22"
  },
  "using_pyopenssl": false
}
```


Hey @hannes-ucsc, the `urlencode` function in Python 3 returns an ascii string, but I don't believe we have a guarantee to provide data we urlencode as bytes. We currently return the body in the native "string" format of your Python version, unless explicitly given something else, which I believe makes sense.

I would suggest either taking care of the urlencoding before passing the data to Requests ~or using the [Prepared Request workflow](http://docs.python-requests.org/en/master/user/advanced/#prepared-requests). You can encode the ascii string before sending the PreparedRequest.~

EDIT: Sorry, I redacted the PreparedRequest part which won't work because of the auth hooks. Since the requests-http-signature library wants bytes, you'll need to supply them manually. This makes sense from their perspective since they probably don't want to be doing any guess work, but gives you the extra burden.