Cache proxy bypass

Added simple cache over `urllib.proxy_bypass` to remedy #2988. Holds on to entries for a minute. Once it reaches its max size, will evict the first entry that is the oldest.

Added tests over the structure, did not add a test that `should_bypass_proxies` invokes the cache.

This is my first pull request; please let me know if I've overlooked something.

Additionally, when I check out master, run `make coverage` in pipenv, the test named 'TestRequests.test_proxy_error' fails. This is still the only failing test when I use my branch. The error is `ConnectionError: ('Connection aborted.', BadStatusLine("''",))`. Is there some additional setup I need to do to run the test suite?

# [Codecov](https://codecov.io/gh/kennethreitz/requests/pull/3885?src=pr&el=h1) Report
> Merging [#3885](https://codecov.io/gh/kennethreitz/requests/pull/3885?src=pr&el=desc) into [master](https://codecov.io/gh/kennethreitz/requests/commit/d6f4818c0b40bc6c00433c013b7daaea83b2cd51?src=pr&el=desc) will **increase** coverage by `0.24%`.
> The diff coverage is `100%`.


```diff
@@            Coverage Diff             @@
##           master    #3885      +/-   ##
==========================================
+ Coverage   89.08%   89.32%   +0.24%     
==========================================
  Files          15       15              
  Lines        1896     1940      +44     
==========================================
+ Hits         1689     1733      +44     
  Misses        207      207
```


| [Impacted Files](https://codecov.io/gh/kennethreitz/requests/pull/3885?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [requests/utils.py](https://codecov.io/gh/kennethreitz/requests/compare/d6f4818c0b40bc6c00433c013b7daaea83b2cd51...c121b98c4eb1e4ee8927995d9b9f1d6bdccd9349?src=pr&el=tree#diff-cmVxdWVzdHMvdXRpbHMucHk=) | `85.02% <100%> (+0.08%)` | :white_check_mark: |
| [requests/structures.py](https://codecov.io/gh/kennethreitz/requests/compare/d6f4818c0b40bc6c00433c013b7daaea83b2cd51...c121b98c4eb1e4ee8927995d9b9f1d6bdccd9349?src=pr&el=tree#diff-cmVxdWVzdHMvc3RydWN0dXJlcy5weQ==) | `100% <100%> (ø)` | :white_check_mark: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/kennethreitz/requests/pull/3885?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/kennethreitz/requests/pull/3885?src=pr&el=footer). Last update [d6f4818...c121b98](https://codecov.io/gh/kennethreitz/requests/compare/d6f4818c0b40bc6c00433c013b7daaea83b2cd51...c121b98c4eb1e4ee8927995d9b9f1d6bdccd9349?el=footer&src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

@Lukasa I see a line like this already in the code base

```
current_time = getattr(time, 'monotonic', time.time)
```

as a top level definition. I've attempted to mock those, but my attempts so far have had some code smells. I've added a new commit that attempts to mock those in the least smelly way, but it's not ideal. Can you help me iron these out so they aren't so strange?

My approaches so far:
1. I set `current_time` in the class and mock it using `mocker.patch.object`. If I set it as a staticmethod or a classmethod, I'm not able to replace the function with a lambda w/o any args or with one anonymous arg. I'd rather not set it as an instance method of the class as that's a bit strange.
1. I use `mocker.patch` and set `current_time` at the global level of requests.structures. The only problem then is I have to import requests.structures (or just requests.structures.current_time), and pyflakes complains about an unused import.

Would appreciate any suggestions.

Your mocking will get a lot easier if you make the `_current_time` callable a module-level object rather than putting it at class scope. =)

I think I must have had a typo, `mocker.patch` with the fully-qualified package name for `current_time` works without doing any extra non-used imports.

@Lukasa thanks for your help with this. As for squashing up all of the commits this PR has accumulated--who should do that? Do the maintainers of this lib do that? Or I can squash locally and push to a new PR (or just force push).

If you squash locally and force push that's fine, GitHub will work it all out. 👍

Force pushed commit addresses the whitespace issues