reimplement substitution composition. add new combinators. fix various other little bugs. implementation is still pretty bad