proving the monad laws

associativity is based on the user's ability to prove that they have
two versions of f and g that only differ in their proof behavior and
that they can convert a proof connecting ((A to B) to C) into a proof
connecting (A to (B to C)). Since we don't control these correctness
properties, I don't believe this is necessarily the case.