The previous go-like RWLock bumps the reader count first and rolls it
back only on the full success path. The state is not reversible on a
partial failure, so a read timeout while a writer holds the lock leaves a
dangling reader credit and permanently blocks future writers (issue #3051).
For the same reason the old implementation could not offer correct try_/timed_ APIs
at all.
Co-authored-by: hairet