Profiling: allow manually adding timings
Configuration: add profiling option

Intended to launch CUDA kernels synchronously.
CUDA: use timed_function for JITModule calls
CUDA: record kernel execution time from driver
Add pass-through for profile from line_profiler
Add separate decorators for line and memory profiling
Wrap line profile decorator around par_loop compute
Sanitize imports
Use lineprof only for backend _compute functions
Add timers for halo exchange sends/receives wait
Docs: profiling PyOP2 applications
Docs: using PyOP2's internal timers
Docs: line-by-line profiling
Docs: memory profiling
Merge pull request #394 from OP2/profiling

Add some more profiling machinery

In particular some key functions are now decorated for use with
either [line_profiler] or [memory_profiler]:

To get a line-by-line profile, run:

    kernprof.py -l <script.py>

To get a memory profile, run:

    mprof run --python <script.py>

[line_profiler]: https://pythonhosted.org/line_profiler/
[memory_profiler]: https://github.com/fabianp/memory_profiler