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)
In os.path, there is:

- isdir (is a directory)
- isfile (is a file)
- exists (exists, regardless of type)

We have all three of these notions, called respectively:

- path_exists (isdir)
- file_exists (isfile)
- exists (exists, equivalent to the two above OR'd)