cookiejar.iteritems() is broken after 2.1.0 update

```
Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.__version__
'2.1.0'
>>> r = requests.get('http://google.com')
>>> r.cookies
<<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='NID', value='67=WbyIM1gU91bGQ5Y3SjPHQ8_fqtStHiMWGJQ5n2Bt_PwytcmPii7fV7AELJ95cqfSmhAHSJCtFm0bBDZJJoTzQHGGQvk6PT8h78PrwWi96r0K7R9N0KsNCZkkrgJW94dV', port=None, port_specified=False, domain='.google.ru', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1403146705, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), Cookie(version=0, name='PREF', value='ID=7c3265d2706e8bea:FF=0:NW=1:TM=1387335505:LM=1387335505:S=LsdqbwGuUdHENT0m', port=None, port_specified=False, domain='.google.ru', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1450407505, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>
>>> dict(r.cookies)
{'PREF': 'ID=7c3265d2706e8bea:FF=0:NW=1:TM=1387335505:LM=1387335505:S=LsdqbwGuUdHENT0m', 'NID': '67=WbyIM1gU91bGQ5Y3SjPHQ8_fqtStHiMWGJQ5n2Bt_PwytcmPii7fV7AELJ95cqfSmhAHSJCtFm0bBDZJJoTzQHGGQvk6PT8h78PrwWi96r0K7R9N0KsNCZkkrgJW94dV'}
>>> r.cookies.items()
[('NID', '67=WbyIM1gU91bGQ5Y3SjPHQ8_fqtStHiMWGJQ5n2Bt_PwytcmPii7fV7AELJ95cqfSmhAHSJCtFm0bBDZJJoTzQHGGQvk6PT8h78PrwWi96r0K7R9N0KsNCZkkrgJW94dV'), ('PREF', 'ID=7c3265d2706e8bea:FF=0:NW=1:TM=1387335505:LM=1387335505:S=LsdqbwGuUdHENT0m')]
>>> r.cookies.iteritems()
<generator object iteritems at 0x1940dc0>
>>> list(r.cookies.iteritems())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/kpp/build/trng_social/venv/lib/python2.7/_abcoll.py", line 387, in iteritems
    yield (key, self[key])
  File "/home/kpp/build/trng_social/venv/local/lib/python2.7/site-packages/requests/cookies.py", line 267, in __getitem__
    return self._find_no_duplicates(name)
  File "/home/kpp/build/trng_social/venv/local/lib/python2.7/site-packages/requests/cookies.py", line 322, in _find_no_duplicates
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name=Cookie(version=0, name='NID', value='67=WbyIM1gU91bGQ5Y3SjPHQ8_fqtStHiMWGJQ5n2Bt_PwytcmPii7fV7AELJ95cqfSmhAHSJCtFm0bBDZJJoTzQHGGQvk6PT8h78PrwWi96r0K7R9N0KsNCZkkrgJW94dV', port=None, port_specified=False, domain='.google.ru', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1403146705, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), domain=None, path=None"
```

Because of this one can't for example build `OrderedDict` from `RequestCookieJar`.


If you can reduce the number of changes to what is absolutely necessary I will be :+1: but as it stands you've added a lot of complexity and python version checking which is unnecessary. Much of the functionality you wrote is provided by `collections.MutableMapping`, the issue is to make that work, not duplicate code (otherwise, we wouldn't inherit from that class in the first place).


the problem is iteritems() with default collections.Mapping implementation will call `__getitem__()`.


I see now why your PR is so large. Your description was awfully miniscule and does not properly describe the problem you're actually solving here. Regardless, I remain :-1: until you fix what are some glaring discrepancies in how you seem to believe some methods behave in Python 3 and how they actually behave. Furthermore, we were already providing a consistent API across both Python 3 and Python 2 so your changes are quite extravagant and overreaching and technically speaking create a backwards incompatible API break.

People will call `items`, `keys`, or `values` expecting lists regardless of python version and now receive conditional values for which something methods will not work. You cannot call `sort` for example on what you're returning from those methods, you'll receive an exception.


I strongly believe that people using python3 should not expect that `keys()`, `values()` and `items()` of a dict-like object will return list.
On the other hand you're right about views. People may want to store keys in a variable and use this variable  more than once.
The way to fix the bug and keep the old API is just `list(self.iter...())` in `keys()`, `items()` and `values()`
The simplest way to fix the bug and implement python3-compatable API is `frozenset(self.iter...())` in `keys()`, `items()` and `values()`.
And finally the most correct way is to use `collections.MappingView` and subclasses. But in this case we should  discuss were to put conditional import.
What do you think?


I must not have been clear. The existing users of requests expect that behaviour regardless of how other Mapping objects behave. That's the behaviour we intend to preserve because backwards API consistency is sacred and we value the implicit contract that we have with our users.


But returning `MappingView` subclasses will also break backward-compatibility - you can't call `sort()` on `KeysView`.


> But returning MappingView subclasses will also break backward-compatibility - you can't call sort() on KeysView.

Exactly, and what you have now is perfectly correct. Once you fix up that test I'm :+1: on this PR. Thanks for pulling through on this. :cake: