Add support for lazy variables
- Lazy variables do not need to be passed with the other variable values
- Defined with a name and lambda, and evaluated lazily when the expression is run
- Good for when you have values that might be used, but might not and are computationally expensive to recalculate each step