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.
The assert is good, but not mandatory. If we where not able to infer that some dimensions are not broadcastable now, the fix here would work. But this mean we would need to update the way we detect what need to be broadcasted. The assert would tell us that.

I'm just trying to explain a little. If you have this assert fail, a simple and good work around is just to comment it. But ideally we need to investigate what happen.