Making sort and sort_by_key work with multidevice vectors

Also introducing vex::less<T>, vex::less_equal<T>, vex::greater<T>,
and vex::greater_equal<T> functors. Those consist of two parts:
a VexCL function called 'device' and host side operator()(T, T).
The need in this comes from the fact that vectors are partially sorted
on device and then merged on host.
Extracting merge of sorted vector partitions into separate function

This may be useful if a user wants to get the sorted result to host
anyway. In this case, doing manual detail::sort() for all vector
partitions followed by detail::merge() will save two trips over PCI bus.
Emit typedefs as part of standard CUDA kernel header on OS X
Merge pull request #86 from ds283/cuda-typedefs

Emit typedefs as part of standard CUDA kernel header on OS X