Semigroup

Added Semigroup.

Then made the Monoid inherit from Semigroup.  This seems to make the most sense to me mathematically.

Nevermind the amount of excess commits, the pertinent ones are the last three.