support binary buffers in comm messages

- add buffers arg to comm Python api
- support binary websocket messages when buffers are present
- reimplement utf8 in javascript, because javascript is the best

The binary message format used on websockets:

```python
[
  nbufs, # number of buffers
  offset0[, offset1[, offset2...]] # offset for each buffer (nbufs offsets),
  buf0 # the first buffer
  [buf1,] # etc.
]
```

The sizes (nbufs and offsets) are serialized as 32b network-order unsigned integers (`struct.pack('!I')`).

[demo notebook](http://nbviewer.ipython.org/gist/minrk/e838bbcd9c6db3ed3f9b)

RFC @jasongrout 

- [x] support binary message in kernel -> frontend
- [x] frontend -> kernel
- [x] add TextEncoder dependency
- [x] tests
- [x] wait for #6221 to update components
Ah, you mean you delete `msg.buffer`. I see. use `_.clone` to make a shallow copy and delete buffer from the clone will be more efficient.