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).
This looks funky, but it's just this code extracted from  `_restore_object_instance_variables`.  ` _restore_object_instance_variables` is safe and sound below. All tests pass, naturally, with this slight refactor.