Refactor notebook-specific diff logic out of diff.py into notebook_diff.py

* `merge.py` had code that was really for diffs, not merges. This code is now in `notebook_diff.py`.
* `diff.py` had code that was notebook specific, so was moved to `notebook_diff.py`
* docstrings added to some important functions