refactor and test DistributedLattice

Create an `ILattice` interface and make the serial and distributed
versions implement it. Update the test code for `Lattice` so that it
now tests both `BasicLattice` and `DistributedLattice`.
Update the `Lattice` to remove an unneeded parameter from the
constructor.

Update the `DistributedLattice` code to fix two problems which failed
tests:

1. The outcome of the returned Supracontexts was not being set
2. Duplicate Supracontexts could be created, instead of just one with
a higher count. This didn't affect the classification, but was still
incorrect.

For the distributed algorithm to properly combine equivalent supras,
change the definition of equality to just comparing contained
subcontext objects. Move the deep equality method into the test file
where it is required.
make labeler account work with different class index

Labeler previously expected that the last instance attribute would be
the class, which is not necessarily true. Update it to account for
different class indices, and test the new functionality.