client: use socket.io instead of polling