Adds Interval Tree Clocks and Vector Clocks with an algebraic approach

I've been geeking out on this for the past few nights.

1) implementing Interval Tree Clock was really fun.

2) I noticed a new concept: a partial semigroup. It seems useful to build operations that are robust to duplication.

3) I think with this, we can make storehaus work with Partial semigroups, which means if we store a value with type (C, T) where we have a clock for C and a semigroup for T we can get duplication tolerance. This is still a little vague to me, but I'd appreciate feedback.
no suuuuper strong opinions here but imho there's enough code here that this could be a package and you could split things out a bit. Might be easier to read if they're in separate files and stuff. This is a giant object. But they are all heavily related so I get the desire to keep them together.