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.
Don't return here, do a `pass` and put the next three statements into an `else` block (as before). The idea of this try/except block was to test the gradients of gradients whenever the reference implementation is capable of computing the gradient of a gradient, and limit the test to the simple (one-level) gradients otherwise. With your change, the test is skipped completely if the reference implementation cannot do gradients of gradients.