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.
Hmm, `local_gpu_careduce` and `local_gpualloc` duplicate the code for this check, and `local_gpu_reshape`, `local_gpu_conv`, `_gpu_conv_to_fftconv` do an unconditional patternbroadcast like I did above.
Shouldn't this be centralized somewhere instead of having each optimizer do it, such as the [`local_optimizer()`](https://github.com/Theano/Theano/blob/master/theano/gof/opt.py#L836) decorator, or a separate decorator, or a helper function?
Otherwise, can't [`gof/fg.py`](https://github.com/Theano/Theano/blob/master/theano/gof/fg.py#L462) be modified to allow a change of the broadcast pattern from `False` to `True` in any dimension? Or will everything break then?