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.
`timed_region` shows up as 16% if cfg.configuration['profiling'] is true, otherwise 3% for my DG0 overhead tests.