Expression optimisations

This implements some nice optimisations for the Expression node, by removing the need for `Expression::hash()` to call into python at all. This means that where an expression may be evaluated many times (for instance, if it affects many scene locations), but depends on an unchanging set of context entries (for instance, if it doesn't use the "scene:path" variable), we get very big speedups.