Make solveHelper use a callback instead of returning on first match

This allows us to combine the exhaustive search logic with solving
Use a more complicated digging algorithm

This new algorithm digs out reflected pairs of cells at random,
and backtracks if the current puzzle would not have a unique solution.
Change number of clues for base difficulty
Add a test that checks for single solutions
Bail out on impossible puzzles

Some random puzzles are *really* hard to solve, for whatever reason.
These are pretty rare, so instead of wasting time trying to solve them,
we bail out and try again.
Get rid of the sanity test

It's not terribly useful