GC.realloc is now more consistent and robust

The specification of $(REF GC.realloc, core, memory) has changed slightly:

$(UL
 $(LI `GC.realloc` now returns `null` for failure. (It used to return the original pointer but
   that is is not a good indication of failure as it might also be returned on success. It can
   lead to overwriting memory if an enlargement was requested.))
 $(LI as with `GC.free`, the caller has to ensure that there are no other live pointers to the
   memory passed to `GC.realloc` (This used to be required only when passing a new size `0`).)
 $(LI as a consequence the GC is allowed to free the memory immediately (the previous
   implementation did this for objects larger than 4kB when shrinking).)
 $(LI block attribute bits on the existing block are only set if it is reused (the previous
   implementation didn't set bits if it reused a small block).)
)

The implementation now properly verifies that pointers are actually base pointers to allocated
GC memory (passing other pointers could have crashed immediately or corrupt the GC).
