**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).

auto res = CreateTransactionInternal(wallet, vecSend, change_pos, coin_control, sign);
    TRACE4(coin_selection, normal_create_tx_internal, wallet.GetName().c_str(), bool(res),
           res ? res->fee : 0, res ? res->change_pos : 0);
    if (!res) return res;
    const auto& txr_ungrouped = *res;
    
    if (txr_ungrouped.fee > 0  && wallet.m_max_aps_fee > -1 && !coin_control.m_avoid_partial_spends) {
        TRACE1(coin_selection, attempting_aps_create_tx, wallet.GetName().c_str());
        CCoinControl tmp_cc = coin_control;
        tmp_cc.m_avoid_partial_spends = true;
        
        const int ungrouped_change_pos = txr_ungrouped.change_pos;
        if (ungrouped_change_pos != -1) {
            ExtractDestination(txr_ungrouped.tx->vout[ungrouped_change_pos].scriptPubKey, tmp_cc.destChange);
        }
        auto txr_grouped = CreateTransactionInternal(wallet, vecSend, change_pos, tmp_cc, sign);
        
        const bool use_aps{txr_grouped.has_value() ? (txr_grouped->fee <= txr_ungrouped.fee + wallet.m_max_aps_fee) : false};
        TRACE5(coin_selection, aps_create_tx_internal, wallet.GetName().c_str(), use_aps, txr_grouped.has_value(),
               txr_grouped.has_value() ? txr_grouped->fee : 0, txr_grouped.has_value() ? txr_grouped->change_pos : 0);
        if (txr_grouped) {
            wallet.WalletLogPrintf("Fee non-grouped = %lld, grouped = %lld, using %s\n",
                txr_ungrouped.fee, txr_grouped->fee, use_aps ? "grouped" : "non-grouped");
            if (use_aps) return txr_grouped;
        }
    }
    return res;
}
bool FundTransaction(CWallet& wallet, CMutableTransaction& tx, CAmount& nFeeRet, int& nChangePosInOut, bilingual_str& error, bool lockUnspents, const std::set<int>& setSubtractFeeFromOutputs, CCoinControl coinControl)
{