This fixes very large and significant bugs - segfaults and memory
leaks - that were present for uninitialised object, more precisely
created but not init'ed ones.
I spent quite a bit of time thinking back on forth how to fix this,
and from the two options of:
- check initialised status on all code paths, or
- don't ever allow invalid/un-initialised objects
The latter one seems the correct one, even though the Python C API
docs imply that doing actual stuff in `__new__` should be "rare".
Tests for reference leaks and wrong re-init added as well; these would
have caught at least memory leaks before.