Avoid using explicit for loops in pointwise kernels.

All such loops are now replaced by their unrolled equivalents.
This change is necessary as arrays accessed inside for loops can
have dynamic indicies; which are no longer permitted.
Transition to a macro-based approach for kernel functions.

The <pyfr:function/> tag is now replaced with a <pyfr:macro/>
tag.  Macros, unlike functions, are inlined when the kernel is
generated.  This avoids the <load> <compute> <store> pattern by
permitting the loads and stores to be mixed in with the compute.
The result is greatly improved register allocation for all of
the pointwise kernels.
Merge branch 'feature/macro' into develop.