Add constraint-gathering function (gatherConstraints)
Add State monad, in order to generate type variables