The student attendance matrix now indicates event being attended

Instead of just indicating whether or not a student attends an event (via
a boolean), we now indicate the presence of an event by a non-negative
integer and the absence of an event by -1.

Solution.Fitness() conseuctive classes calculation simplified by one
branch.

Added Solution.AssignmentQuality() which determines how many soft
constraints an assignment violates. It is not the case that the sum of
assignment qualities is Solution.Value() because each event involved in
a conflict will be counted as many times as there are events in the
conflict.
Added population.Individual, which is exported.

population.individual is the internal data structure for the heap whereas
population.Individual is intended to be exposed to allow crossovers
between individuals (using the parental success ratio crossover). An
*individual is converted to an *Individual using individual.export().

A popHeap is now []*individual instead of []individual.

population.Select() now releases pointers to *Success and *individual.
Heuristics now return the modified solution.

Modify controller.go and population.go to take advantage of this fact.
This change allows for chaining of functions that take solution pointers.
Added parental success crossover operation.

The parental success crossover is a replacement for the randomly chosen
1-point crossover. It uses the results of past crossovers and quality of
assignments to determine which parent should contribute which allele
(i.e., event) to the child.

Moved Success.Crossover into Individual.didCrossover. This prevents
success ratios from being modified outside of the population package.
population.Pick -> population.PickSolution; it now returns []tt.Rat

Every instance of population.Pick() also called .Assignments() on the
resulting *tt.Solution, so population.Pick was modified to call
.Assignments() before returning.
Replaced 1-point crossover with parental success crossover.

solutionRequestMessage is now instanceRequestMessage.

Use the tt/pqueue.pqueue data type to order assignments in the parental
success crossover (population.Crossover).

Initial populations are now built via random assignments
(heuristics.RandomAssignment() in heuristics.go).