Version 0.8: the solver now allows solutions with violations

The solver now always uses fully-assigned solutions, which may or may not
have hard constraint violations.

Remove set package and datatype. Domains are now []tt.Rat. Domains are now
only generated once (in parse.go#ParseSolution) and stored in the
*tt.Instance. Each *tt.Solution gets a copy of the slice ([][]tt.Rat),
which amounts to copying a pointer and and two integers (a SliceHeader).

tt.Value no longer has a Distance field; instead, it now has a Violations
field.

Update checker/checker.go to report the violations in number of violations
in addition to the distance (which should now always be zero) and the
fitness. In addition, report if the solution is invalid (violations > 0)
or infeasible (distance > 0).

Solution.Violations() determines the number of hard constraint violations
in the solution (as verified by the official checksln3b program). In
addition, Solution.AssignmentQualities() now reports violations.

Remove heuristics.MostConstrainedOrdering and
heuristics.RandomVariableOrdering.

Remove tt/pqueue package; it is no longer used.

The start-up phase of the protocol has been simplified. Now, a waitMessage
(which contains a *sync.WaitGroup) is sent out to all islands. Each island
sends one to its children. The notifications bubble up so the controller
can know when all populations have finished generating.

The controller no longer does most-constrained variable first search. It
no longer sends the initial valueMessage. Instead, the controller, all
islands, and all slaves are assigned the top value of {math.MaxInt32,
math.MaxInt32} and the slaves will report their best-valued solutions from
population generation.