Numerous small changes to the constraint solver
The main thing is that we now keep unsolved Derived constraints in the wc_flats of a WantedConstraints, rather than discarding them each time. This actually fixes a poential (admittedly obscure) bug, when we currently discard a superclass constraint, and may never re-generate it, and may thereby miss a functional dependency. Instead, reportErrors filters out Derived constraints that we don't want to report. The other changes are all small refactorings following our walk-through.