Decompression refactoring

This replaces a mishmash of pointers in the Block and BlockContents classes with std::unique_ptr. It also changes the semantics of BlockContents to be limited to use as a constructor parameter for Block objects, as it owns any block buffers handed to it

Furthermore, it has a lot of refactoring. This was needed mostly within ReadBlockContents, which did some tricky abuse of function calls and booleans to switch between using a heap pointer or stack pointer. This drops that boolean by replacing it with a simple pointer while at the same time allowing a unique_ptr to handle any cleanup that might escape the previous version of ReadBlockContents.

Zero leaks have been detected since these changes, plus complexity is greatly redueced.