add contents webservice

This mainly renames the 'notebooks' service to 'contents' and teaches it about regular files. There is no longer special treatment of directories, just different forms for `content`. Tree view now shows all files.

As usual, modeled on GitHub [contents API](https://developer.github.com/v3/repos/contents/).

I will enumerate the changes to the models and API, but the gist:

- all contents models have name, path, dates, type
- type is one of: directory, file, notebook
- if content is requested:
  - additional `format` key will be `json`, `text`, or `base64`, describing `content`
  - `content` will be
    - list of JSON models for directory contents
    - notebook JSON for notebooks (format=json)
    - file text for text files (format=text)
    - b64-encoded data for binary files (format=base64)
I added it because I needed it. Note that `path` always refers to the parent directory of the model, but `path + name` can refer to a file *or* directory, so when checking if the target exists in `get_model`, it can be either a file or directory.

One thing we could do is eliminate the path/name distinction, and just have a single 'path' key with the full path to the target. Some things would get more complicated, others simpler.