fix Supracontext and its use

In many places an implementation of `Supracontext` was used instead of
the interface, and this hid the fact that `count` really needed to be
kept in `Supracontext` instead of `LatticeNode`. Move `count` into
`Supracontext`, make `HeterogeneousLattice` implement `Lattice`, and
then update code everywhere to use the interface instead of the
implementation. This required moving the combination code out of
`UnclassifiedLattice`, which is OK since it is going to have to be
overhauled somehow anyway.
reduce memory usage of lattice combiner method

Previously combining `HeterogeneousLattice`s could create an
exponential number of intermediate `UnclassifiedSupra` objects. Change
the combination algorithm to a recursive function instead, reducing
memory usage to just the number of `HeterogeneousLattice`s. Update
`LatticeTest` with a finnverb test which detected a specific problem I
had with incorrect counting.