Reimplement union-like behaviour for BlockData
Reimplement union-like behaviour for BlockData

BlockData is composed from BlockId and BlockMeta and used when
writing to file, a small memory optimization would be to drop the
BlockData as a field and introduce a method to combine the two.

Setting BlockId or BlockMeta appropriately sets their values into
BlockData.

LambdaSix/InfiniMap,LambdaSix/InfiniMap