WIP: Manual rebase of @dlsun's tabs implementation

This version is a WIP. The commit is supposed to reflect @dlsun's original implementation as closely as possible and we can move on from there. I modified the author to give Dennis proper credit. I'm happy to do a bit more work on this, but I thought I'd advertise now to get feedback on the UI.

Is the right place to discuss this PR on issue #1905?  The code is pretty much unchanged from Daniel's implementation, which is PR #2206  There are some good comments on that PR, which I wish could be transferred here somehow.

Here's a mini-todo list, reflecting what still needs to be done and aggregating other's comments.

* fix regressions/finish rebase:
  - [ ] fix delete cell, insert cell at bottom, below, above, 
  - [ ] fix undelete sheet, cell
  - [ ] fix execute all cells in worksheet, execute range of cells in a worksheet
  - [ ] loaded notebooks intialize as "dirty" and ask if user is sure they want to navigate away on tab close
* suggestions from other two issues
  - [ ] I can't repro @Carreau's [issue](https://github.com/ipython/ipython/pull/2206#issuecomment-7351376), but it should be checked
  - [ ] the tabs take up a ton of space and change in size when hovered/editing. Consider different UI?
* my suggestions
  * execute all worksheets? (following ordering of the worksheets themselves)
  * integrate tabs with one of the existing toolbars (they'd have to be smaller) or switch to a dropdown for them
  * have to think about how the worksheets should integrate with the slides work that's ongoing.  If that work hadn't started yet, I would have said that there's a presentation mode where a slide <==> worksheet.  I haven't followed the slide work so I don't know how it would integrate.