Rename a variable to avoid a conflict

The variable "order" was used twice unintentionally: first it was used to store
the value of the command line argument "--filter-order", then it was overwritten
with the value 5, which was passed to scipy.signal.butter().
Minor simplification
Fix a bug in LTISys usage

The problem is that scipy.signal.lfilter crashes when the dimensionality of the
states "zi" does not match that of the input signal.  This was triggered in
__main__.py because an LTISys instance was created with the wrong number of
channels.

Since I have now localised the source of the crash, this commit changes LTISys
to avoid the for loop.
Require all arguments to __gen_filter_bank
Change the way optional arguments are denoted
Clean up argument handling

The arguments are now handled better.  First, all arguments except "order" have
a default value.  Specifically, fs defaults to 1.0, and max_edge_freq defaults
to half the sampling frequency.  Secondly, the order of arguments was changed to
make more logical sense.  And finally, the argument order in __gen_filter_bank()
has been changed to match the signature of the constructor.
Rename n_chn to nchn
Switch to using the @property decorator
__main__: support sampling rates down to 1.0
Allow passing arbitrary filter design functions

Replace the current string argument "filter_type" with a function argument
"design_func".  This removes the limitation of the filter bank to elliptic and
Butterworth filters.