Replace the 200ms polling loop with a faster and more efficient waiting
operation. This should speed up short RPC tests.This was tried a few times before, but given up every time because
solutions use a condition variable which is not safe for use in signals
as they need to be reentrant.On UNIX-ish OSes, use a safe way: a pipe. When shutdown is requested
write a dummy byte to the pipe. Waiting for shutdown is a matter of a
blocking read from the pipe.On Windows, there are no signals so using a condition variable is safe.
This is a backport of core#20605