**Is your feature request related to a problem? Please describe.**

If coin selection fails as part of `send` or `sendtoaddress`, the error message returned to the RPC client is `Insufficient funds`, even if the actual cause is due to `too-long-mempool-chain`.  This is likely to alarm users unnecessarily, as they will believe this means their funds have permanently vanished rather than being temporarily inaccessible.

**Describe the solution you'd like**

If coin selection fails due to `too-long-mempool-chain`, the `send` and `sendtoaddress` methods should pass that error back to the RPC client, instead of `Insufficient funds`.

**Describe alternatives you've considered**

It would be even nicer from a UX standpoint if the limit on mempool chain length were removed, but AIUI [that's a DoS vector](https://github.com/bitcoin/bitcoin/issues/9752#issuecomment-281464014), so is not going to happen.

**Additional context**

Apparently this is [already done for `sendrawtransaction`](https://github.com/bitcoin/bitcoin/pull/10015#issuecomment-288597075).  The discussion in https://github.com/bitcoin/bitcoin/pull/10015 is relevant (it appears that the PR was withdrawn for reasons unrelated to my request).

{
    params.only_spendable = false;
    return AvailableCoins(wallet, coinControl,  std::nullopt, params);
}
CAmount GetAvailableBalance(const CWallet& wallet, const CCoinControl* coinControl)
{
    LOCK(wallet.cs_wallet);
    return AvailableCoins(wallet, coinControl).GetTotalAmount();
}
const CTxOut& FindNonChangeParentOutput(const CWallet& wallet, const COutPoint& outpoint)
{
    AssertLockHeld(wallet.cs_wallet);
    const CWalletTx* wtx{Assert(wallet.GetWalletTx(outpoint.hash))};
    const CTransaction* ptx = wtx->tx.get();
    int n = outpoint.n;
    while (OutputIsChange(wallet, ptx->vout[n]) && ptx->vin.size() > 0) {
        const COutPoint& prevout = ptx->vin[0].prevout;
        const CWalletTx* it = wallet.GetWalletTx(prevout.hash);
        if (!it || it->tx->vout.size() <= prevout.n ||
            !wallet.IsMine(it->tx->vout[prevout.n])) {
            break;
        }
        ptx = it->tx.get();
        n = prevout.n;
    }
    return ptx->vout[n];
}
std::map<CTxDestination, std::vector<COutput>> ListCoins(const CWallet& wallet)