Generically generate a Semigroup (<>) operation for any type
implementing Generic. This operation will append two values
by point-wise appending their component fields. It is only defined
for product types.
gmappend a (gmappend b c) = gmappend (gmappend a b) c