High Performance Profiling for RHS and LHS assembly

This branch is meant to complement the python profiling that is currently in master. It handles individual parallel loops, in particular the ones responsible for the RHS and LHS assembly.

Important flags to set:
```
PYOP2_LAZY=0
PYOP2_HPC_PROFILING=1
```
Curently only the sequential and openmp backends are supported.

Likwid profiling is also introduced, at both kernel and wrapper level.

Support for Valuable Bandwidth measurements.

The branch passes PyOP2 tests locally.
Still to do: 
  - add PyOP2 tests for profiling.
  - add instructions on how to use the framework.

**Note:**
I opened this pull request in order to spark constructive feedback on how to best incorporate this functionality into PyOP2.
As per my previous comment, the tighest profile-able region in Firedrake is most often around an assemble() or solve() function which can reduce to several par loops in PyOP2.