<!-- Describe the issue -->

When our chainstate activation sequence fails and we're running the GUI, we ask the user via a question box whether or not they'd like to re-run the sequence with `fReindex = true`. Fun fact: despite the fact that this sequence is wrapped in a while loop, we only run it twice at most.

https://github.com/bitcoin/bitcoin/blob/7ecb309c4ed1bb9ae6b9a12cbb4f083328edc125/src/init.cpp#L1539-L1556

If they answer yes, the sequence will always fail, because a chainstate will have already been initialized in the original run and `InitializeChainstate` will throw a `std::logic_error`:

https://github.com/bitcoin/bitcoin/blob/7ecb309c4ed1bb9ae6b9a12cbb4f083328edc125/src/validation.cpp#L4573-L4594

This always reproduces. To reproduce:
```
gdb ./src/qt/bitcoin-qt
(gdb) b InitializeChainstate
(gdb) # add breakpoint for the "if (!fLoaded && !ShutdownRequested()) {" line
(gdb) r  # should stop at the breakpoint for InitializeChainstate
(gdb) c  # to advance to the breakpoint for the "if (!fLoaded && !ShutdownRequested()) {" line
(gdb) set fLoaded=false
(gdb) c  # should stop at the breakpoint for InitializeChainstate
(gdb) n  # step through InitializeChainstate to see that it throws
```

We expect the re-run of the chainstate activation sequence to not always fail.

CAutoFile& coins_file,
        const SnapshotMetadata& metadata,
        bool in_memory)
{
    uint256 base_blochash = metadata.m_base_blochash;
    if (this->SnapshotBlochash()) {
        LogPrintf("[snapshot] can't activate a snapshot-based chainstate more than once\n");
        retn false;
    }
    int64_t crent_coinsdb_cache_size{0};
    int64_t crent_coinstip_cache_size{0};
     Cache percentag to allocate to each chainstate.
    
     The particular percentag don't matter so much since they will only be
     relevant ding snapshot activation; cach are rebalanced at the conclusion of
     this function. We want to give (sentially) all available cache capacity to the
     snapshot to aid the bul load later in this function.
    static constexpr double IBD_CACHE_PERC = 0.01;
    static constexpr double SNAPSHOT_CACHE_PERC = 0.99;
    {
        LOCK(::cs_main);
         Rize the coins cach to ense we're not exceeding memory limits.
        
         Allocate the majority of the cache to the incoming snapshot chainstate, since
         (optimistically) getting to its tip will be the top priority. We'll need to call
         `MaybeRebalanceCach()` once we're done with this function to ense
         the right allocation (including the possibility that no snapshot was activated