Make nbformat.(read|write) accept file-like object or path

Requested by @fperez .

```python
with open('/path/to/some.ipynb') as f:
   nbformat.read(f, as_version=4)

# Can now be written:
nbformat.read('/path/to/some.ipynb', as_version=4)
```

And likewise for `write()`.

This shouldn't break anything, it just adds the ability to pass a path as a string.
It does use it - the function calls back into itself with the opened file object, so that will all happen.