Handle failing solves (first cut).
Refactor common code out, and add support for unreachable package errors.
Handle unreachable packages.

Add test cases with errors, and start working on adapting for the differences in error returns.