Filtering (filt) across columns of arrays and method signature tweaks

Here are yet two more patches for `filt` and `filt!` following #7513.

#### 1. Enable filtering (filt) across columns of arrays. 
When passed a multidimensional array, simply iterate over its columns, independently filtering each one.  The starting filter state may be given as a vector (in which case it is common across all columns) or an array with the same number of columns as the input.  This is a pretty common feature and is very handy.

cf. https://github.com/JuliaDSP/DSP.jl/pull/58#issuecomment-48619941

#### 2. Relax filt signatures to allow heterogeneous types
Previously, `filt[!]` methods were only defined for arguments of all the same type `T<:Number`. This relaxes that restriction, allowing one to, for example, filter an array of Float32s by Float64 coefficients. Instead of defining many type parameters (`T<:Number, S<:Number, R<:…`), filt now simply trusts that the eltype of the arrays have methods for basic arithmetic. By default, the output of filt will be determined by `promote_type` of all arguments.


I needed this second change to simplify filtering of arrays of Float32s. It should generally be more forgiving.

cc: @simonster, @timholy, @codles
Short of fixing type inference, I like the general pattern of having output arguments be first (they're closer to the left-hand side, which is where outputs usually go). You could make `out` a required argument for `filt!`, forcing the user to say `filt!(x, b, a, x)` when you want to filter in-place.