It was surprisingly easy to get the notebook code running under Python 3.
@ellisonbg, there was a bytestring/unicode mismatch somewhere that I didn't properly investigate - I just stuck in the quick fix you can see in handlers.py. Let me know if there's a better place to solve it.
Saving the notebook isn't working (it complains about invalid JSON), and my testing was rather brief, but this does at least allow the notebook to start under Python 3.
Add notebook resources to Python 3 build process.
Fix for notebook in Python 3.
Decode data for saving notebook, allowing saving in Python 3.
And saving notebooks now works in Python 3 too. I've assumed the PUT requests to save the notebook will always be UTF-8 encoded - let me know if that assumption is invalid.
This code looks clean and I don't see any problems with the notebooks on py2, so I'm merging for now; I trust you on the py3 part and all of this just improves things on py3 anyway...