Final, full protocol 2 support

This adds full pickle protocol 2 support:
- `__reduce__` and `__reduce_ex__` may redirect to another object
- Will use `__reduce__` or `__reduce_ex__` if provided, in preference to object `__dict__` or `__slots__`; will not use `__reduce__` or `__reduce_ex__` for special-cased classes, and will not use the default `object` implementations of those methods.
- Adds support for pickling iterators (and adds optional parameter `max_iter` to avoid livelocking on infinite iterators).
- Adds support for `__getinitargs__` and unpickling classic classes which take `__init__` parameters, even if `__getinitargs__` is not provided.