* Fixed optimizer to handle missing cases
* Internal change to use EvalContext instead of passing around multiple objects
* .analyze() now return the EvalContext instead of a dict
* Duplicate expressions are cached to avoid wasted re-evaluations. This allows
expressions with low selectivity to still avoid being re-evaluated, even though
they are not in a branch.
* Export ast.Undefined from the pypred package, since it is generally useful
for writing custom resolvers.
* SHA: 7d44ae4