Add support for subsampling and gradient to GpuDnnConv

This adds a grad() method to GpuDnnConv and adds support for subsampling.  It also allows choosing between convolution and cross-correlation mode (however cross-correlation mode has not been tested).

I've also made a base class that create the cudnn handle to make other ops easier to write.
You can't just pass the subsample parameter here. Due to the truncation of size, with only kerns and top and the subsample, you can't infer the output shapes of the gradients. Check what is done for the GpuCorrMM and if you can do the same, this is good. From memory, it pass the shapes wanted.