Make moves created from a board immutable
Improve the Piece api
Refactor move validation