deep substitution of variables within Type constraints
substitute variables on both sides of application after unification
minor cleanup: remove unneeded ctor argument
more cleanup
introduce simple CLI interface

* Can compile factorial function (and run it!)
* can be configured to use specific input and output streams