Reduce overhead

A bunch of changes to reduce the overhead of calling the same par_loop again and again.

Summary:

- purges lazy evaluation (since I have not thought hard enough about how the new features should interact and we currently don't use it anyway).

- reduces the amount of type-checking ctypes does when calling a compiled function: we generate the code so the types are "guaranteed" to be correct.

- Exposes the ParLoop object in the public API
  You can now repeatedly run the same par_loop (with the same arguments) by doing:
```python
   pl = ParLoop(.....)
   for i in range(100):
       pl._run()
```

- adds a (no-error-checking) `replace_arg_data` routine that replaces the data payload of a specified argument in a ParLoop.  That means you can cons up a new Dat or Mat, replace it in a saved ParLoop and call the ParLoop again writing/reading the new (rather than original) object.

- various minor adjustments to kill unnecessary repeated computations when rerunning a parloop.

I think the only truly controversial part of this is the lazy evaluation purge.  Comments welcome.
Apart from the offset this is identical to the OpenMP version. Not sure it's worth consolidating though given that `host` currently doesn't override `ParLoop`.