Additional features for Firedrake parloops

* Allow specifying keyword arguments in a Firedrake par_loop to e.g.
  define custome headers or user code to be included in the kernel.
* Support for components of mixed functions as arguments. This appears
  to only work for direct loops at the moment due to mismatching
  iterset in the indirect loop case. No idea what is happening.