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 will need to pass the image height and width to `...GradI` and the kernel height and width to `...GradW` in case `self.subsample` is not 1 for the corresponding direction, don't you? ([See `GpuCorrMM`](https://github.com/Theano/Theano/blob/master/theano/sandbox/cuda/blas.py#L845) or [the cuda-convnet wrapper](https://github.com/lisa-lab/pylearn2/blob/master/pylearn2/sandbox/cuda_convnet/filter_acts.py#L378).)