We need a way to search a problem's state space without having to construct a
full graph beforehand.
We can do this by constructing a search tree for a problem "on the fly".
The search tree is similar to those produced by the
BFS and DFS graph search algorithms already described.
We can construct a state space search tree without a problem graph because we
have Move objects that know how to construct new states given a
current state.