Problem: gettxoutsetinfo, scantxoutset, and dumptxoutset retain LevelDB iterators after releasing cs_main.
While those iterators are live, AssumeUTXO cache rebalancing can call ResizeCache(), replace m_db, and cause LevelDB to abort.
The issue was [reported during review of #35465](https://github.com/bitcoin/bitcoin/pull/35465#discussion_r3428902672).
Fix: Each cursor holds a shared lock on m_db_mutex for its lifetime.
Compaction takes the same shared lock, allowing it to run alongside cursors.
ResizeCache() takes m_db_mutex exclusively, so it waits for their shared locks to be released before replacing m_db.
ResizeCache() holds cs_main while it waits, so a long-running UTXO scan can stall validation during cache rebalancing.
<details> <summary>Historical test failures without the fix</summary>
test/coins_tests.cpp:1090: error: in "coins_tests/coins_db_cursor_resize": check !CCoinsViewDBTestAccess::TryExclusiveLock(db) has failed
test/coins_tests.cpp:1102: error: in "coins_tests/coins_db_cursor_resize": check status == std::future_status::timeout has failed [0 != 1]
</details>