Refactor mixed-precision implementation.

We allow for a different precision in the preconditioner stage of the SPIKE solver
through an additional template parameter, named 'PrecValueType'.  All calculations
within the preconditioner are performed with this type and with containers based on it.

Solution is calculated with the precision implicitly defined by the 'Array' template
parameter used to instantiate the SPIKE solver.
Force the type of scaling factors to double.

Ensure that intermediate calculations for obtaining the MC64 scaling factors are
always performed in double precision, regardless of the underlying data type
to prevent loss of accuracy.
Fix a small bug which results in failure of MC64.

Note that for mixed precision, we would like to force everything
inside MC64 to be double. For the previous version, one place in
MC64 is NOT forced to using double.
Fix template arguments for all CUDA kernels.

Several kernels were templatized by two different REAL types.
This is not needed as they are always instantiated to the same type
(namely the underlying type used for preconditioning).
Merge branch 'feature/mixed_precision' into develop