Add support for lattices.

Since we started this project, Spire added support for boolean algebras,
heyting algebras, and lattices.

This commit adds type classes for these types.
Merge remote-tracking branch 'origin/master' into topic/lattices
Added Semilattice and BoundedSemilattice.

I also tried to provide some initial documentation for lattices,
but I'm sure the text can be improved. There is some tension between
using mathematical symbols (concise and easy to read IMO) and using
the methods (denser but closer to code).

It would be still be good to link to the relevant Wikipedia articles and
other useful sources as well.
Clean up lattices a bit.

This commit introduces generic semilattices (and bounded semilattices).
It also adds some useful conversions to/from the various lattice types,
as well as conversions to PartialOrder instances.

It also moves some operations from Bool onto Heyting (where they are
just as valid) and provides a method to get a commutative ring from
a heyting algebra.
Fix partial order semantics for join-semilattices.

Previously, I had a confused understanding of how a
join-semilattice should order elements. Oscar set me
straight.

Now, Semilattice has two methods to generate PartialOrder
instances:

 - asMeetPartialOrder
 - asJoinPartialOrder

This means that MeetSemilattice and JoinSemilattice can
each create the correct partial ordering for a given
Lattice.
Add unicode notation for the top and bottom of bounded lattices.
Merge pull request #9 from non/topic/lattices

Add support for lattices.