Merge random number generators for OpenCL and CUDA backends

RNGs have separate implementations for OpenCL and CUDA backends. This PR unifies the implementations and uses standard `backend::source_generator` for source generation.