Widget trait serialization

Here's a rough draft of a pull request to enable custom serialization for traits on widgets.  I also added a default klass attribute to the Instance traitlet, so you could subclass Instance to easily get a new traitlet for a certain class.  Here is an example where this is useful:
```python
def np_to_list(a):
    if a is not None:
        return a.tolist()
def np_from_list(a):
    if a is not None:
        return np.array(a)

class NDArray(Instance):
    klass = np.ndarray
    metadata = {'serialize': np_to_list,
                'deserialize': np_from_list}
```
Then the NDArray traitlet will by default have the klass and some custom metadata.


TODO:
- [x] Change "unserialize" to "deserialize".  It seems that everyone but PHP talks about deserialization rather than unserialization.
- [x] possibly change from/to_json to serialize/deserialize.  This leaves the door open to having binary buffers also transferred when the changes Min made last week regarding binary buffers in Comm messages percolate upwards to widgets.
@SylvainCorlay opened another PR for it.  The code changes conflict, so I incorporated his changes here, since we are both changing how the serialization works.