Propagate shape information to ConvOp gradients

Another attempt at closing #2089, as an alternative to #2095.

I just went through `theano/tensor/nnet/conv.py` from top to bottom trying to understand and clean up the shape inference code. Changes are:
* In `has_all_shape()`, `nkern` and `bsize` default to `1` so they can be omitted to just check for completeness of `imshp` and `kshp`.
* `getOutputShape()` supports symbolic shapes and shapes including `None`s. Also it returns a tuple instead of a numpy array.
* `imshp`, `kshp`, `imshp_logical`, `kshp_logical`, `outshp` and `fulloutshp` are guaranteed to be tuples after `__init__()` was called, but can contain `None`s. All the code is adapted to this.

I just tested this with `theano/sandbox/cuda/test_conv_cuda_ndarray.py:test_gemm_grads` and found that I had to disable shape inference (`infer_shape()`) by unconditionally raising a `ShapeError` for it to work. So probably something is wrong, but I cannot look into this today. Regard this as "under construction", but let me know if you have any comments.
Good point, but yes, it's needed. If I disable it, I get a bunch of `Optimization failure due to: local_gpualloc_memset_0` again.