socket.io integration; closes #54 and #55