Supporting forloop over Dict attributes.

Previously, if a list or dict was an attribute of a dict, the loop would
fail silently.  For loops have been refactored to infer the type of the
loop object within the rendered code, and to perform the appropriate series
of assignments on the basis of that type.

So the following all works:
{% for key in dict %}
{% for item in dict.items %}
{% for key, value in dict.items %}
{% for key in dict.child %}
{% for item in dict.child.items %}
{% for key, value in dict.child.items %}
{% for item1, item2, item2 in list %}
{% for item1, item2, item2 in dict.childList %}
{% for item in list %}
{% for item in dict.childList %}

This support extends (or at least it should!) to arbitrary levels of
nested objects.

Signed-off-by: David Arbuckle <dintlu@gmail.com>
Rendering template with data *after* cacheing, for debug purposes.
Refactored testrunner, accessible via runTest().

Signed-off-by: David Arbuckle <dintlu@gmail.com>