Switch fixture spawning to use multiprocessing.

Previously, functional tests were spawned using the subprocess module.
This worked, but was slow (owing to a sleep added to attempt to avoid
races), brittle, and occasionally could lead to race conditions where
the spawned server was not yet listening and thus the test would fail.

This changes the mechanism used for spawning fixture servers to use the
multiprocessing module. Rather than sleeping long enough to allow the
fixture to set itself up properly, a queue is used by the spawned server
to signal when its ready to accept connections. Additionally, this helps
eliminate a previous issue whereby occasionally a fixture would attempt
to bind to a port that was already in use. It now avoids this by binding
to port 0, which allocates a random free port to the fixture server.

As a pleasant side-effect, the time taken to run the full battery of
tests with a single test process has been reduced from approximately
60secs to about 4.5secs.