Bugfix for erroneous board equality check

Connor Duggan correctly reported that just using tile state
is not enough to represent a board - what if we have a different
arrangement of vertical and horizontal blocks that cover
the same tiles?  e.g.

            AA AA          AA BB
            BB BB    vs    AA BB

if we just compare tile data, the two boards will seem identical
when we check the 'visited' set in the main loop - but they
are not!

We therefore store a hash per block, formed by combining the
block index, and the block coordinates (simple shifts, since
all 3 numbers easily fit in 8 bits - see Block::hash())