Move fulfilled/rejected memoizers to prototype to avoid recreating them
Simplify joinAssimilate and remove Assimilated promise
constructor. Optimize flatMap by assuming a truth promise (possibly
not valid in the future). Reorganize private methods.

Add unit tests for algebraic laws for map, ap, and flatMap