This reverts commit b450d87. It turns out that libeio doesn't actually leak memory but it does do an unnecessary (and confusing!) allocation that is not free'd until after the user callback returns.
1. Ensure that failed writes don't leave the write queue in an inconsistent state. Before, write requests were handed back to the user but were not removed from the write queue. The cause of at least one use-after-free bug. 2. Pass the error to the callback on the next iteration of the event loop instead of returning it immediately.
Nothing works - no tests. This is just to coordinate efforts between Bert and I.