allow annotations to be expressions

Hi there, the main goal of this PR is to allow fine tuning cache lifetimes for generated keys:

{% cache 'v1/' ~ some_object.key 100 %}
...
{% endcache %}

{% cache 'v2/' ~ some_object.key 120 %}
...
{% endcache %}

instead of using multiple generational cache strategy with different litfetimes we now use one lifetime strategy with generated key