TCP message parsing and ordering
`socket.on('data', buf => JSON.parse(buf))` might not work in case server reply does not fit into single TCP packet. This is why we might have JSON parsing errors. What the code should do is buffer chunks until it meets a new line character which is a message separator in startum protocol (line based text protocol), something like:

``` js
socket.on('data', chunk => {
  this.buffer += chunk;

  // maybe add a lopp here in case multiple messages are in same chunk.
  if (this.buffer.includes('\n')) {
    const [message, rest] = this.buffer.split('\n', 2);
    this.buffer = rest;
    this.emit('message', message);
  }
});
```

<hr/>

Also, if server replies come in out of order, we have a broken state. For example:

1. Client sends ID#3. Server takes some time before reply is ready.
1. Meanwhile, client sends ID#5 which server replies right away.
1. Client reads reply ID#5.
1. Client receives reply ID#3.

If I am reading code correctly, it means client will have replies mangled — Reply#5 will be processed as though it is for Request#3 and vice versa. Am I correct?

Thanks.