Precompile the kernels and embed the binary into the C file.
Rework the interface to GpuKernelBase to accept a list of kernel object.

Each item will be precompiled separetly and embedded into the c_code
of the Op. This allows ops that need multiple kernels or that will
choose between alternatives at runtime to use this interface.  It also
groups all kernel-related parameters under one object.

This change also save the source of the kernel code to re-attempt
source compilation in case the binary is rejected for some reason
(some implementations do not support reloading from pre-compiled
kernel).

There may still be more changes to how stuff works under the hood
(most notably a blacklist of bad runtime/drivers that crash when
attempting to create a kernel from a binary), but the visible
interface should not change anymore, so now is the time to start using
it more.
Fix a bunch of problems that I somehow managed to miss when testing the previous commit.
Fetch the kernel name from the Kernel object in the c_code and document what Kernel represents.
Fix the last remaining problems with the existing clients and make the kernel code for MRG more OpenCL-friendly.
Merge pull request #1833 from abergeron/kernel_precomp

Kernel precomp