Expression caching

improved version of #9006 (which was an improved version of #8942)
I don't really understand this test --- "should calculate the literal every single time", but asserting that the filter and watcher was only called once in two digests.

What are we actually testing here? That, because the inputs didn't change, we don't call the filter / consider the watch to have changed?