Add plog() and a nifty new substitution system

This adds the ```plog()``` function to ```ExpressionBuilder``` per #4047. With it I'm revamping the substitution system to allow for more powerful substitutions. Apart from replacing a symbol with a term (now done using the ```EBTermSubstitution``` rule) it is now super easy to rewrite terms in an expression. The ```EBLogPlogSubstitution``` rule is such an example. It replaces every occurrence of ```log(*)``` with ```plog(*,epsilon)``` (with a given ```epsilon```).