Reduce overhead

Reduce overhead in repeated reassembly of the same form (optionally into the same tensor).  This is exactly what we have when solving nonlinear problems, or anything with timestepping.  This takes advantage of the changes in OP2/PyOP2#404 to save ParLoop objects on a form and just re-execute them immediately rather than building new ones when we reassemble.

We also adapt to the change that removes lazy evaluation in pyop2.