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.
No there isn't.

And we never unload a module since that is just not possible under python 2, and the closest equivalent in python3 is to get the reference count of the module object to 0, which still does not unload the dynamic object.