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
Argh. I think you're right. That's frustrating. The same will be true for `si` in filt above since it's a part of the type promotion. That one is easier to make a positional argument, but `filt!` would ideally have two optional arguments, and with one in front it'd be ambiguous with positional args.

Any suggestions?