fix: various bugs

 - use a reverse path when trying to remove a node, so that we can walk through all the nodes with a forward pointer to this node
 - a wrong pointer was used as the 'previous' element in a skiplist walk
 - add some unit tests