баг распознан и ликвидирован.
как оказалось, это вовсе не баг, а неправильное использование функций asio.
в примечании к
async_write() есть такое:
The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.
я все время под этим понимал то, что одна из перечисленных функций не должна вызываться одновременно из другого потока, пока эта на завершиться.
а оказалось, что их нельзя вызывать до тех пор, пока не будет вызван хэндлер предыдущей.
всем спасибо.