Use open_node events instead of reopen to determine when a set of nodes has been fully reopened

For #3905.

Originally, we were relying on getting a `reopen` event every time a set of nodes was reopened. That event doesn't seem to wait for the given nodes to actually open asynchronously. So, instead, we wait for callbacks from all the `open_node` events for each node we want to open, and then proceed with the next set of nodes only when the nodes one level up have actually all opened.