When a capnp init interface declares a construct() method (as observed in example/init.capnp and Bitcoin Core's Init interface), the generated ProxyClient constructor invokes it automatically, resulting in a blocking IPC call during the construction of the client within ConnectStream.
If that call fails, such as when connecting to a disconnected socket, the exception escapes ProxyClientBase's constructor. Normally, cleanup occurs in the destructor but if the constructor throws no object is created, and the destructor doesn't run. As a result, cleanup functions are not called, the Connection object is leaked, and its EventLoopRef prevents EventLoop::loop() from exiting.
Any thread that joins the event loop thread then hangs forever. In #298 this made the disconnected-socket test hang the whole suite instead of failing.