Opportunity for increased sharing during substitution
Currently substitution within Core rebuilds the entire expression, even if the expression does not mention any variables in the domain of the substitution. This both increases GC pressure and increases residency of the compiler.
It may be worth trying to carrying information back "up" the substitution traversal describing whether the original expression being substituted into changed due to the substitution. If not then we can simply use the original expression, preserving sharing.