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.
I added the assert because [@abergeron asked for it](https://github.com/Theano/Theano/pull/2103#discussion_r17459573). It's probably a good safety measure, but these `patternbroadcast(new_out, old_bcast)` hacks in the optimizers seem misplaced to me.