Added multiple 'Undo Delete Cell' in Notebook 

The 'Undo Delete Cell' function in the notebook currently only allows a single undo (issue #4924).
I modified the notebook.js file so that it is possible to restore the last `Notebook.undelete_max` deleted cells at the correct indices in the notebook.
I replaced the corresponding variables (`undelete_backup`, `undelete_index`, `undelete_below`) with arrays to store this deleted cell history and used the `push`, `pop` and `shift`  methods to establish the desired FIFO like behaviour.
As a side effect I fixed a off-by-one error in the `insert_element_at_index` function.
I set the deleted cell history size to 10 what seems reasonable to me (unless your 'd'-key gets stuck ;) ).
I tested everything in chromium-browser and checked the js-console for possible errrors. So far it just works as expected.
@ellisonbg 

It will make a difference whether you merge cell `i` into `j` or `j` into `i`. For neighbouring cells it **does** matter in the undelete process. The way the method is defined cell at index `j` (second argument) will **always** be deleted.
Without the `below` argument, merge `i-1,i` would not delete the cell above but the actual cell, whereas merge `i,i+1` would work as exspected by deleting the cell below.
You can `merge_cells(7,32)`, `merge_cells(7,32,false)`, `merge_cells(32,7)` and `merge_cells(32,7,false)`, each of which will have  a different result.