Non-square Filters and Separated Stride and Padding

*Note this is a work in progress and I need to double-check the indices and add new tests.*

Accept pairs of height/Y and width/X values for kernel size, stride, and pad in lieu of a single, shared value.

Of course the square/equal case still works and the old defaults (stride = 1 and padding = 0) are kept.

Open to comments on implementation and style. In particular, the pairs of variables feel awkward and I might switch to `std:pair`.
should probably `CHECK_GT(conv_param.kernel_size_size(), 0)` first. Also `CHECK_GT(kernel_height_ * kernel_width_, 0)` after setting those -- we should have had a similar check all along really (since kernel_size defaults to 0).