Switch to locally importing mpi4py.

This avoids potentially unwanted calls to MPI_Init() when
importing PyFR modules.
Change how MPI is initialised/finalised/aborted.

This takes advantage of the fact that more recent CUDA-aware MPI
libraries do not require CUDA to be initialised before calling
MPI_Initalize.
Make device selection more flexible.

For the CUDA backend there is now an option:

[backend-cuda]
device-id = round-robin | local-rank | int

to select the CUDA device to use.  The default is round-robin.
For the OpenCL backend the following options are now available:

[backend-opencl]
platform-id = name | int
device-type = all | cpu | gpu | accelerator
device-id = name | local-rank | int

where the default platform-id is 0, the default device-type is
all, and the default device-id is local-rank.  Further, the
local rank code has been enhanced to support all MPI platforms.
Add preliminary support for mesh partitioning.

Currently backends exist for both METIS and SCOTCH.  Using
pyfr-mesh partition it is possible to repartition both meshes and
associated solutions.
Incorporate a workaround for Python Issue 16609.
Enhance the partitioning interface.
Ensure connectivity array strings are four characters long.
Further tweak our MPI finalise/abort handler.
Remove partition support from the Gmsh reader.

This permits us to make a range of optimisations and
simplifications to the code.
Improve how we search for and load dynamic libraries.
Incorporate partitioning into to the documentation.
Whitespace fixes.
Permit shell variables anywhere in the config file.
Remove some moribund docstrings from the backend.
Whitespace fixes.
Allow matrices without an extent to be allocated immediately.
Fix a typo in the user guide introduced in the previous commit.
Improve performance by transposing the operator matrices.

This change is not currently applied in the OpenMP backend.
Merge branch 'feature/blasnt' into develop.
Cull some more outdated docstrings.