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 `k_width` not be `k_height` here? (didn't actually think about it, that would just be my guess from the vars your multiplying with, and you said you were trying to chase down a GPU impl. bug so I thought I should at least comment..)