Add further pickle protocol 2 support:

- verifies setstate is called
- if no setstate, but getstate exists, only replace instance with state if there is no newargs;
  if there is newargs, instance should not be an empty shell
- if no newargs or setstate, adds special case handling for state as dict or 2-tuple of (dict, dict) or (None, dict)
  such that those dicts are used as a source for setattr
- No tests or code added to implemet/verify __reduce__ or __reduce_ex__ support

(Also, this now works with objects inside the state dicts).
Common line pulled out of the if branches