WIP: Filter cache

use a cache to avoid recomputing filters during dirty-checking.

in the modified large-table benchmark delivers 3x speed improvement for number filter (apply duration), but makes the uppercase filter 20% slower

TODO:
- more benchmarking
- special case dates since they are not primitives but can be cheaply compared via `getTime()`
- decide on whether to make the cache an opt-in or an opt-out
If the filter has no parameters, you put an array of the values and if does not, the raw value. I wonder if this can be an issue as `filterName + '_i_' + expression` is not unique. This is, given the expression `foo | filter:bar && foo | filter`, both `filter` will have `filterCacheKeyInput == 'filter_i_foo | filter:bar && foo | filter'`, but one will expect `filterCache[filterCacheKeyInput]` to be an array and the other the raw value. Anyhow, the solution would be to change this to
```js
var filterIndexAtExpression = this.index;
var filterCacheKeyInput = filterName + '_' + filterIndexAtExpression +  '_i_' + expression;
var filterCacheKeyResult = filterName + '_' + filterIndexAtExpression +  '_r_' + expression;
```