On posting this to Reddit, a person pointed me to Oxide's RFD 609, which describes this exact issue. If only I had read it before writing the code that led to this bug. Oxide calls this scenario "Futurelock". If you have already read that, what my post can give you are links to tokio's source code where they implement this waiter queue for their mutex.
Author here. I can answer questions if any.
On posting this to Reddit, a person pointed me to Oxide's RFD 609, which describes this exact issue. If only I had read it before writing the code that led to this bug. Oxide calls this scenario "Futurelock". If you have already read that, what my post can give you are links to tokio's source code where they implement this waiter queue for their mutex.