Rewrite BlockAllocator in attempt to free faster.

And more importantly try to find that weird heap corruption, but no
luck...
Avoid a double lookup in FreeExact().
Merge pull request #1945 from unknownbrackets/perf

Rewrite BlockAllocator in attempt to free memory faster