Switch to using a singleton for the UnderlyingCaller. This should
mean that we try resolve functions after main() is called (assuming
that the user doesn't try to call OpenCL functions in static
initialisers). I'm hoping this will fix issues running under OSX
but I'm not that optimistic.