Fix memory leak where Struct, _LongBase, _StrBase, String leaked their __dict__ on deallocation.
* Use a fixed-size struct for String (unicode objects are in fact fixed-size)
and store its variant_level that way.
* Don't store Struct, _LongBase, _StrBase variant_level and Struct signature
in a __dict__, but instead have a global dict mapping object IDs to variant
levels, and a global dict mapping Struct IDs to signatures. This is a bit
strange, but easier than correctly freeing the __dict__ (which is stored
at the end of a variable-length struct, so somewhat hard to get at).
* With this change, allocating objects in a loop no longer leaks memory, and
neither does the test case supplied by Luka Renko.