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
True, I hadn't looked at the implementation , just as the doc when underscore one precise that clone does a shallow copy. For implementation, though it seems `$.extend` differs from `_.extend` : 

> One major difference between underscore.js extend and jquery extend is in the way they deal with sub-objects or nested objects. Jquery does a deep copy of sub-objects, while underscore.js does a shallow copy. You need to keep this in mind as problems caused by shallow copies can be hard to troubleshoot.

From [there](http://techiella.wordpress.com/2013/04/02/underscore-js-extend-vs-jquery-extend/). 
Though the jquery doc does not agree but is not clear to me if what they say is for multiple sources or only one. 

> if a property of the first object is itself an object or array, it will be completely overwritten by a property with the same key in the second or subsequent object. The values are not merged. This can be seen in the example below by examining the value of banana. However, by passing true for the first function argument, objects will be recursively merged.

I suppose ours are small enough that it does not make a difference.