2: Monoids and Semigroups

Our first functional structures are Monoids and Semigroups. These aren't immediately relevant to monads, but they're simple and will get us used to thinking about abstract structures with Haskell classes.