2 layers of SIGINT handling

This adds 2 layers of `SIGINT` handling to Spin sever:

* If the process receiving the `SIGINT` is *not* the Spin server process, the `SIGINT` is "bubbled up" by exiting.

* If the process receiving the `SIGINT` *is* the Spin server process, it's first ignored. If a second `SIGINT` is received within the time window (5 seconds), the server exits.

The overall effect of these changes is that when Ctrl+C is pressed, the child process (the test) exits, but leaves the server running.