Adds algebraic semigroup implementation.

Fixes jshint configuration.
Fixes semigroup implementation to follow {companion, typeclass} exports convention.
Where companion is a function that returns an instantiated algebraic typeclass of the type typeclass.
This is necessary because Semigroup is the definition of a semigroup. However, semigroups may be of many
concrete instances, each of which will necessitate its own implementation of the defined concat operation. This idea is borrowed from the scala language, but js is limited by syntax. There may be a better way to define typeclasses via objects, which are then mixed into the concrete instances' prototypes. The default instance implemented here is the NumberSemigroup.