`banlist.dat` was introduced in https://github.com/bitcoin/bitcoin/pull/6310, storing nodes that were automatically banned (due to exceeding the misbehavior threshold) and manually banned (through the `setban` RPC).

Automatic bans were removed in https://github.com/bitcoin/bitcoin/pull/19219 and replaced with a discouragement filter. That filter is not saved to disk/persisted over shutdown/startup. The `banlist.dat` therefore now only contains addresses that have been banned through the `setban` rpc.

Since https://github.com/bitcoin/bitcoin/pull/15935, we have a specific file for configuration that is updated through the RPC and persisted over shutdown/startup, namely `settings.json`. We should therefore move the manual ban configuration from `banlist.dat` to `settings.json`. Doing so has a couple of benefits:

- `settings.json` is human readable and easily analyzable by any json parser.
- we wouldn't need to maintain custom [de]serialization code for the `banlist.dat` file.

`banlist.dat` is expected to be fairly small and infrequently updated, so disk space/performance are not huge concerns.
connOptions.uiInterface = &uiInterface;
    connOptions.m_banman = node.banman.get();
    connOptions.m_msgproc = node.peerman.get();
    connOptions.nSendBufferMaxSize = 1000 * args.GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER);
    connOptions.nReceiveFloodSize = 1000 * args.GetArg("-maxreceivebuffer", DEFAULT_MAXRECEIVEBUFFER);
    connOptions.m_added_nodes = args.GetArgs("-addnode");
    connOptions.nMaxOutboundLimit = 1024 * 1024 * args.GetArg("-maxuploadtarget", DEFAULT_MAX_UPLOAD_TARGET);
    connOptions.m_peer_connect_timeout = peer_connect_timeout;
    for (const std::string& bind_arg : args.GetArgs("-bind")) {
        CService bind_addr;
        const size_t index = bind_arg.rfind('=');
        if (index == std::string::npos) {
            if (Lookup(bind_arg, bind_addr, GetListenPort(), false)) {
                connOptions.vBinds.push_back(bind_addr);
                continue;
            }
        } else {
            const std::string network_type = bind_arg.substr(index + 1);
            if (network_type == "onion") {
                const std::string truncated_bind_arg = bind_arg.substr(0, index);
                if (Lookup(truncated_bind_arg, bind_addr, BaseParams().OnionServiceTargetPort(), false)) {
                    connOptions.onion_binds.push_back(bind_addr);
                    continue;
                }
            }
        }
        return InitError(ResolveErrMsg("bind", bind_arg));
    }
    if (connOptions.onion_binds.empty()) {
        connOptions.onion_binds.push_back(DefaultOnionServiceTarget());