Split out of #34132 (review).
Problem
We have two ways to check a coin exists in the db. One tries to deserialize, the other just returns whether any value is associated with the key. But we usually need the full value we probed for, and HaveCoin cannot cache the returned value, so it can trigger an extra lookup if HaveCoin uses Exists and the caller later needs the actual value.
We’re already delegating most HaveCoin calls to GetCoin anyway for the above reasons, so the current implementation of HaveCoin is redundant.
Fix
Replace HaveCoin calls with GetCoin, reuse ReadRaw in dbwrapper, stop ignoring deserialization failures, and readjust tests to this simpler state.
See https://github.com/bitcoin/bitcoin/blob/cd0959ce9b7c5b80ebd45b652d557630b4dc604b/src/dbwrapper.cpp#L304-L331 and https://github.com/bitcoin/bitcoin/blob/ a9b7f5614c24fe6f386448604c325ec4fa6c98a5/src/dbwrapper.h#L206-L241.