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.