If the server never responds to our keepalive pings, we don't do anything. Instead, we should tear the connection down.
I think this means that wocky_porter_force_close_async() needs a reason parameter saying why it's happened, to allow Gabble to explain what happened to the user when the connection vanishes from underneath it.
We could also use g_socket_set_timeout() on the underlying GSocketConnection, but this would depend on WockyXmppConnection knowing that its GIOStream is actually a GSocketConnection. That seems okay to me. In fact, this is what Loudmouth did: it blindly sent keepalive pings, and depended on the socket dying to kill the connection. It seemed to work. But I don't know how this interacts with proxies. I guess maybe we'd still need to do the application-level timeouts in that case.