semi-persistent notebook IDs

notebook id is invariant for the lifetime of the notebook server exactly as before, and is based on the *initial* name of the notebook.

- If the notebook is renamed, its UUID will not change
  during this session, but it will have a new UUID in the next session.
- If a notebook has the same initial name as another previously seen,
  it will get a random ID, avoiding any collisions.

Currently, the user has no control over the initial names of notebooks, which means that even with this scheme, UUIDs are almost guaranteed to change from the session in which a notebook is created and the next.  To address this, a 'name' argument is added to both the 'new notebook' and 'copy notebook' methods, and these actions now prompt for the name of the new notebook before creating them.

Be *extremely* careful testing this PR - the reason we haven't done persistent UUIDs before is our first attempt resulted in data loss, so we must be careful and rigorous here.