Add Semigroup, Monoid, Group and AbelianGroup, and improve documentation