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.
There should be a function in the cudnn library which takes care of computing the right sizes from the descriptor.  However it is bugged for the gradient with regards to the weights.  I have reported this and it should get fixed.  In the meantime, I would rather not special-case this.