Rewrite the puzzles to be states themselves

This removes the need for extra classes and allowed for values to be
reused more.