This function is easier to read non-diff'd. Basically, two things change:

1. We no longer loop over a node to split into smaller nodes. It'll just split into two nodes at most.

2. If a split occurs then we find the next sibling branch to check if there is enough space to add the split keys and still stay below the fill percent. If so, then it adds the keys but only returns the left node of the split. The right sibling will get written out when `spill()` is called from its parent.

There was a subtle bug initially where a node could get materialized in order to check for space but not be spilled later on. I'll line note that below.