DOC: Make plot in signal.iirfilter docstring appear,
add note about highpass symmetry, change comment wording
BUG: buttap() should produce a purely real pole

Previously buttap for odd orders produced a pole like -1+6.1e-17j rather than -1+0j exactly.  This made poly(p) complex, though all the imaginary parts were negligible.  This then made the ba representation complex, though it is a purely real filter.

Now the calculation is symmetrical, so the middle term works out to -exp(0j), which is exactly -1+0j.
BUG: Change cheb1ap() to produce a purely real pole

Change theta of calculation to make it symmetrical about 0, so that the lone pole for odd-ordered filters is an exact real number, and the pole pairs are exact conjugates, so that ba representation (from numpy.poly) is purely real.

Also some simplifications:
arcsinh(1 / eps) is equivalent to log((1 + sqrt(1 + eps * eps)) / eps)
-sinh(mu + 1j*theta) is equivalent to -sinh(mu) * cos(theta) + 1j * cosh(mu) * -sin(theta)
which is the rotated version of the original
-sinh(mu) * sin(theta) + 1j * cosh(mu) * cos(theta)
BUG: Change cheb2ap() to produce a purely real pole

Change theta of calculation to make it symmetrical about 0, so that the lone pole for odd-ordered filters is an exact real number, and the pole pairs are exact conjugates, so that ba representation (from numpy.poly) is purely real.
TST: Add test for purely real output of IIR filters
TST: Add tests for filter design functions
BUG: int arguments to filter design functions result in np.int wraparound, convert to float first like the original lp2lp
TST: Test for integer frequencies causing wraparound
BUG: zpkt2f sometimes produces complex output with negligible imaginary parts
Fixed in https://github.com/numpy/numpy/pull/4073, but we can't depend on a specific numpy version, so copying it here, too.
TST: Add test for real ba output type of IIR filters
ENH: Raise an error if digital filter frequencies are out of range (Octave does this, too)