Add FreeMonoid and FreeGroup

This adds 2 new number types: the `FreeMonoid` and `FreeGroup`.
So giving it more than two seconds of thought, I realized that the implementation I'm imagining only works for a free abelian group and would actually return `(Option[A], Option[A])` I think.

The free structure traits could still be useful though.