A bunch of small fixes

Here's a description of the changes in this pull request:

- Added dummy kernels to OpenCL C and SPIR programs to avoid errors caused by empty programs on some implementations of OpenCL.
- Changed the C codegen to generate float literals in hex instead of decimal to avoid loss of bits. This required a somewhat ugly dependency on LLVM due to the lack of a portable non-C++11 way to do this. 
- Implemented most of the math library in SPIR.
- Tweaked the gpu_multi_kernel test to avoid floating point issues. 
- There actually is an (f)abs in OpenCL C :)