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.
Curious, why is this not using the write code below that does `writes` and then checks for bytes?  Or is that handled automatically by the write call when it gets an actual file object?