Express audio gain in dB for consistency.
Add a control for spectrum display averaging.
Fix Radio widget misbehaving when cell is read-only.

Not yet done: we should apply similar treatment to all other widgets,
and add tests.
Remove abuse of 'summary' element.
Revise UI style: remove beveled borders.
Change spectrum colors for higher contrast.
Extract HTTP client glue from test_db.py.
Redirect /<rootCap> to /<rootCap>/ and add tests.

In order to test shinysdr.web.listen, added:
* support for automatic port number assignment (endpoint tcp:0)
* interface to shut down the listening ports created by listen()
Choose default sample rate near 2.4M rather than maximum.

This avoids problems where the device's capabilities exceed those of the
CPU or the bus between them (such a case was reported by a USRP owner).

Also if the device starts out tuned to a nonzero frequency, keep it
rather than tuning to 98MHz, and if it's zero tune to 100MHz, which is
marginally less arbitrary.

For the curious, 98MHz was a round number that was close to the
frequency of a nearby broadcast FM station when I was working on early
versions that had no persistent state to remember tuning.