> wallet: erase spkmans rather than setting to nullptr
>
> In many places in ScriptPubKeyMan managing code, we assume that the
> ScriptPubKeyMan being retrieved actually exists and is not a nullptr.
> Thus removing a ScriptPubKeyMan requires erasing the object from the
> map rather than setting it to a nullptr.
> wallet: fix segfault by avoiding invalid default-ctored `external_spk_managers` entry
>
> In the method `CWallet::LoadActiveScriptPubKeyMan`, the map
> `external_spk_managers` (or `internal_spk_managers`, if parameter
> `internal` is false) is accessed via std::map::operator[], which means
> that a default-ctored entry is created with a null-pointer as value, if
> the key doesn't exist. As soon as this value is dereferenced, a
> segmentation fault occurs, e.g. in `CWallet::KeypoolCountExternalKeys`.
>
> The bevaviour can be reproduced by the following steps (starting with empty regtest datadir):
>
> ```
> $ ./src/bitcoind -regtest -daemon
> $ ./src/bitcoin-cli -regtest -named createwallet_name=wallet descriptors=true blank=true
> $ cat regtest-descriptors.txt
> [
> {
> "desc": "tr([e4445899/49'/1'/0']tprv8ZgxMBicQKsPd8jCeBWsYLEoWxbVgzJDatJ7XkwQ6G3uF4FsHuaziHQ5JZAW4K515nj6kVVwPaNWZSMEcR7aFCwL4tQqTcaoprMKTTtm6Zg/1/*)#mr3llm7f",
> "timestamp": 1634652324,
> "active": true,
> "internal": true,
> "range": [
> 0,
> 999
> ],
> "next": 0
> }
> ]
> $ ./src/bitcoin-cli -regtest importdescriptors "$(cat regtest-descriptors.txt)"
> [
> {
> "success": true
> }
> ]
> $ ./src/bitcoin-cli -regtest getwalletinfo
> error: timeout on transient error: Could not connect to the server 127.0.0.1:18443 (error code 1 - "EOF reached")
> ```
>
> Bug reported by Josef Vondrlik (josef-v).
This is a backport of [[https://github.com/bitcoin/bitcoin/pull/22379 | core#22379]] and [[https://github.com/bitcoin/bitcoin/pull/23333 | core#23333]]
Depends on D14207