From what I can tell `CClientUIInterface::[signal_name]_disconnect` is a no-op.

In other words calling it does *not* disconnect the slot:

For example `uiInterface.NotifyBlockTip_disconnect(BlockNotifyGenesisWait);` in `AppInitMain(...)` does not disconnect `BlockNotifyGenesisWait` as one would expect. The result being that `BlockNotifyGenesisWait` is invoked for every new block :-)

Running `bitcoind` with some debug printing added shows the issue:

```
[signals] CClientUIInterface::ThreadSafeMessageBox_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::ThreadSafeMessageBox_connect(...) exited with 1 connected slots.
[signals] CClientUIInterface::ThreadSafeQuestion_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::ThreadSafeQuestion_connect(...) exited with 1 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) exited with 1 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) entered with 1 connected slots.
[signals] CClientUIInterface::InitMessage_connect(...) exited with 2 connected slots.
[signals] Calling uiInterface.NotifyBlockTip_connect(&RPCNotifyBlockChange) in OnRPCStarted()
[signals] CClientUIInterface::NotifyBlockTip_connect(...) entered with 0 connected slots.
[signals] CClientUIInterface::NotifyBlockTip_connect(...) exited with 1 connected slots.
[signals] Calling uiInterface.NotifyBlockTip_connect(BlockNotifyGenesisWait) in AppInitMain(...)
[signals] CClientUIInterface::NotifyBlockTip_connect(...) entered with 1 connected slots.
[signals] CClientUIInterface::NotifyBlockTip_connect(...) exited with 2 connected slots.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
[signals] Calling uiInterface.NotifyBlockTip_disconnect(BlockNotifyGenesisWait) in AppInitMain(...)
[signals] CClientUIInterface::NotifyBlockTip_disconnect(...) entered with 2 connected slots.
[signals] CClientUIInterface::NotifyBlockTip_disconnect(...) exited with 2 connected slots.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
[signals] RPCNotifyBlockChange(...) was invoked.
[signals] BlockNotifyGenesisWait(...) was invoked.
... and so on ...
```

Note how `BlockNotifyGenesisWait(...)` is called also after `uiInterface.NotifyBlockTip_disconnect(BlockNotifyGenesisWait)`.

I think the problem is that the `disconnect(...)` member function of `boost::signals2::signal` expects a function pointer to be passed in (the same that was passed to `.connect(...)`), but we're doing:

```
void CClientUIInterface::signal_name##_disconnect(std::function<signal_name##Sig> fn)
{
    return g_ui_signals.signal_name.disconnect(&fn);
}
```
#endif
#else
    hidden_args.emplace_back("-upnp");
#endif
    gArgs.AddArg("-whitebind=<addr>", "Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6", false, OptionsCategory::CONNECTION);
    gArgs.AddArg("-whitelist=<IP address or network>", "Whitelist peers connecting from the given IP address (e.g. 1.2.3.4) or CIDR notated network (e.g. 1.2.3.0/24). Can be specified multiple times."
        " Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway", false, OptionsCategory::CONNECTION);
    g_wallet_init_interface.AddWalletOptions();
#if ENABLE_ZMQ
    gArgs.AddArg("-zmqpubhashblock=<address>", "Enable publish hash block in <address>", false, OptionsCategory::ZMQ);
    gArgs.AddArg("-zmqpubhashtx=<address>", "Enable publish hash transaction in <address>", false, OptionsCategory::ZMQ);
    gArgs.AddArg("-zmqpubrawblock=<address>", "Enable publish raw block in <address>", false, OptionsCategory::ZMQ);
    gArgs.AddArg("-zmqpubrawtx=<address>", "Enable publish raw transaction in <address>", false, OptionsCategory::ZMQ);
    gArgs.AddArg("-zmqpubhashblockhwm=<n>", strprintf("Set publish hash block outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), false, OptionsCategory::ZMQ);
    gArgs.AddArg("-zmqpubhashtxhwm=<n>", strprintf("Set publish hash transaction outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), false, OptionsCategory::ZMQ);
    gArgs.AddArg("-zmqpubrawblockhwm=<n>", strprintf("Set publish raw block outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), false, OptionsCategory::ZMQ);
    gArgs.AddArg("-zmqpubrawtxhwm=<n>", strprintf("Set publish raw transaction outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), false, OptionsCategory::ZMQ);
#else
    hidden_args.emplace_back("-zmqpubhashblock=<address>");
    hidden_args.emplace_back("-zmqpubhashtx=<address>");
    hidden_args.emplace_back("-zmqpubrawblock=<address>");
    hidden_args.emplace_back("-zmqpubrawtx=<address>");
    hidden_args.emplace_back("-zmqpubhashblockhwm=<n>");
    hidden_args.emplace_back("-zmqpubhashtxhwm=<n>");
    hidden_args.emplace_back("-zmqpubrawblockhwm=<n>");
    hidden_args.emplace_back("-zmqpubrawtxhwm=<n>");
#endif
    gArgs.AddArg("-checkblocks=<n>", strprintf("How many blocks to check at startup (default: %u, 0 = all)", DEFAULT_CHECKBLOCKS), true, OptionsCategory::DEBUG_TEST);
    gArgs.AddArg("-checklevel=<n>", strprintf("How thorough the block verification of -checkblocks is: "
        "level 0 reads the blocks from disk, "