Refactor harness boot sequence

The harness's boot sequence was simplified, in part by making it more
synchronous. Additionally, the harness code was cleaned up slightly.
Boot the network synchronously

In particular, the network now synchronously opens its UNIX sockets during
Network.Start().

This addresses a problem in which an agent might race against Octopus booting
its network, resulting in listening sockets not being present when an agent
boots, but instead appearing shortly after.
Fix how SPOF monkey checks for progress

SPOF monkey now ensures that the cluster is able to respond to a
never-before-seen request while each of the nodes is removed.

This fixes a race condition in which a cluster with a designated primary (WLOG
"node0") could trick the SPOF detector into thinking node0 was not a single
point of failure. Consider the following sequence of operations:

- Octopus generates a request and sends it to node1
- node1 forwards the request to node0
- node0 processes the request and sends the result back to node1
- SPOF monkey decides to target node0
- node0 is netsplit away and frozen
- node1 responds to Octopus with the result it got back from node0
- Octopus acknowledges the response as evidence of forward progress