Added puzzle-solving implementation that tries combinations of remaining possibilities to solve complex puzzles
- bitmasks weren't as helpful here, so refactored to keep track of possibilities as arrays of integers
- keeping track of remaining possibility count to help avoid extra loops
- elimination is tried first
- if elimination doesn't work, we start trying all combinations of remaining possibilities, starting with those cells that have the fewest