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.
Behold the power of Modulus!

The remainder of the division of the x/y over the chunk dimensions is
the location of the x/y in the chunk.
Adding missing files and unit tests, remove program stub.