create a kernel class to allow for more sophisticated kernel handling.
e.g. an instance of the kernel class could have preferred methods for:
kernel splittings for use in Helsing-Ojala style quadrature
fast kernel evals, e.g. by calling fmm2d wrappers
stable kernel evaluation for small inputs
evaluating gradient, hessian etc.
constructors should be built for the common PDEs: Laplace, Helmholtz, Stokes, etc, with default kernels by boundary condition, etc.
create a kernel class to allow for more sophisticated kernel handling. e.g. an instance of the kernel class could have preferred methods for: