<!-- 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.

if (piex->IsAssumedValid()) {
             Assumed-v
            assert(piex->nTx > 0);
             Assumed-v
            assert((piex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TREE);
        } else {
             Otherwise 
             actually 
            assert(((piex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TRANSACTIONS) == (piex->nTx > 0));  This is pruning-iepeent.
        }
         All parents having had data (at some point) is equivalent to all parents being VALID_TRANSACTIONS, which is equivalent to HaveTxsDownloaded().
        assert((piexFirstNeverProcsed == nullptr) == piex->HaveTxsDownloaded());
        assert((piexFirstNotTransactionsValid == nullptr) == piex->HaveTxsDownloaded());
        assert(piex->nHeight == nHeight);  nHeight must be consistent.
        assert(piex->pprev == nullptr || piex->nChainWor >= piex->pprev->nChainWor);  For every bloc except the genis bloc, the chainwor must be larger than the parent's.
        assert(nHeight < 2 || (piex->psip && (piex->psip->nHeight < nHeight)));  The psip pointer must point bac for all but the first 2 blocs.
        assert(piexFirstNotTreeValid == nullptr);  All m_blocman.m_bloc_iex entri must at least be TREE valid
        if ((piex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TREE) assert(piexFirstNotTreeValid == nullptr);  TREE valid impli all parents are TREE valid
        if ((piex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_CHAIN) assert(piexFirstNotChainValid == nullptr);  CHAIN valid impli all parents are CHAIN valid
        if ((piex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_SCRIPTS) assert(piexFirstNotScriptsValid == nullptr);  SCRIPTS valid impli all parents are SCRIPTS valid
        if (piexFirstInvalid == nullptr) {
             Checs fo
            assert((piex->nStatus & BLOCK_FAILED_MASK) == 0);  The failed mas cannot be set for blocs without invalid parents.
        }
        if (!CBlocIexWorComparator()(piex, m_chain.Tip()) && piexFirstNeverProcsed == nullptr) {
            if (piexFirstInvalid == nullptr) {
                const bool is_active = this == &m_chainman.ActiveChainstate();
                 If this b
                 is valid 
                 setBlocI