address oscar's comments about case classes, iterator undefined behavior, secondary constructors, and beefing up unit test to include SSMany instances for semigroup laws