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.
Ah, perfect. I didn't see the whole file and didn't realize that the write call was recursive.

Wonderful solution to the conundrum that `with` imposes on making the created variable only accessible in local scope!!! Very nice job.  I thought about that for a minute and couldn't think of a clean solution, this is beautiful.

Merging then, thanks!