Split move testing between public and internal API

The public Board.make does two things: it parses the move text
from the user and then if parsing is successful it also makes
the move. Parsing is only successful if the move is valid, in
addition to having the correct syntax. A move is valid only if
it satisfies the Board invariant.

This commit represents work that will take a few passes to complete.
In this first pass the testing of Board.make that takes a Move
type was completely reworked. It is now higher quality than before.
Also, there was a need to further ensure that no invalid move can
be created from one of the Move factory methods on Board.

After this work is completed the Move factory methods, parseMove,
and the various isMoveValid queries will all be in sync and
accurate. In particular, isMoveValid will prevent an invalid move
from being created in the first place. Board.make relies on the
accuracy of this test so that the invariant will be satisfied
when a move is made.