Add move_equal function for comparing move_t's
Add move_t ownership of square_t's.

Having weak ownership in the move_t struct causes some complicated
scenarios surrounding if/when square_t structs should be freed.

To address this, this commit changes the ownership of square_t's
within move_t structs to strong: meaning that the move_t is responsible
for freeing any squares its given.  While this means that duplicate
squares will need to be created for each move_t struct, which may become
memory intensive, it simplifies move creation, reducing the potential
for memory leaks in tricky situations.