RELEASE 2.14.0: Solver fixes
Fixed 2 solver bugs, and added better verbose solver debugging output.
The first bug was very simple and I'm surprised it hasn't caused issues before. It was a bug in the RequirementsList class. This class would give incorrect values from the names and conflict_names properties when a requirements list was made up of confict- and non-conflict requirements which get merged (eg, ["foo-1", "~foo-1.2+"]). This in turn was causing incorrect extractions during the solve.
The second bug was more difficult to understand. In the solver, whenever a "scope" changes - that is, it is either intersected, reduced, or split into 2 new scopes - other scopes must then reduce against it. However there was one case not taken into account. That is when an existing conflict scope (eg "~foo-1") is intersected with an extraction (eg "foo-1.2+") to then become a non-conflicting scope. In this case, that scope itself then needs to reduce against the other scopes as well. The reason is that this is the only case where a changed scope "widens" - ie new variants appear in the scope. Because there are new variants, the scope needs to be reduced, because some of these variants might conflict with the current scope set.
Solver debugging output has also been improved for readability, and some more detailed stats have been added.
The description of the solver algorithm has been improved also, and has been moved from the block comment at the top of solver.py into the new file SOLVER.md in the same directory.