### Expected behavior:

1. `importaddress` or `importpubkey` a watching-only address or pubkey with a label
2. Receive a transaction to that address; observe that the label has been applied to that transaction
3. `importprivkey` the private key for that address without specifying any change to the label
4. Have the previous label still applied to the transaction after the import.

### Observed behavior on 0.15 and current master:

Steps 1-3 the same.
4. Previous label is replaced with the default empty label ("")

Problem seems to have occurred on 0.15 and affects the latest master (see subsequent details).  I'd suspect all versions are affected, i.e. it's not a regression.

### Steps to reproduce

```bash
## For testing
ADDRESS=2N6Y2wdhd91mQnZ8qCeH6hT5aZZygXFnNjP
PRIVKEY=cQriWp98xU9ghRvDKbzkRcgcecQLezjYwtPUjLNN5kzT8GbdnxQt

## Starting a fresh regtest (i.e. ~/.bitcoin/regtest/ previously deleted)
$ bitcoind -daemon -regtest
Bitcoin server starting

## Import the address with a label and no rescan
$ bitcoin-cli -regtest importaddress $ADDRESS "Watch-only test" false

## Mine a generation tx to the address (regular spending works too)
$ bitcoin-cli -regtest generatetoaddress 1 $ADDRESS > /dev/null

## Bury the generation tx so it shows up in the wallet
$ bitcoin-cli -regtest generate 100 > /dev/null

## See that the address label was applied to the tx
$ bitcoin-cli -regtest listunspent | jq .[].label
"Watch-only test"

## Import the private key.  Note the 'label' parameter is not explicitly passed
$ bitcoin-cli -regtest importprivkey $PRIVKEY

## See that the address label has been set to empty :-(
$ bitcoin-cli -regtest listunspent | jq .[].label
```

Same thing happens if `importpubkey` is substituted for `importaddress`.  I haven't tested `importmulti` for either address/pubkey or privkey import, nor have I tested using named parameters.

### Use case

I was watching-only addresses from my cold wallet, then moved my coins to new addresses and (after some confirmations) imported the old private keys so that I could sell fork coins.  I didn't realize until now when I was trying to do some bookkeeping that all my old cold wallet labels were reset (happily, I have backups, so nothing is lost but time).

### Possibly related issues

- #12698 looks related but the poster there says that it works on mainnet.  I discovered my problem from actual use on mainnet and reproduced on regtest.
"      \"scriptPubKey\": \"<script>\" | { \"address\":\"<address>\" }, (string / json, required) Type of scriptPubKey (string for script, json for address)\n"
            "      \"timestamp\": timestamp | \"now\"                        , (integer / string, required) Creation time of the key in seconds since epoch (Jan 1 1970 GMT),\n"
            "                                                              or the string \"now\" to substitute the current synced blockchain time. The timestamp of the oldest\n"
            "                                                              key will determine how far back blockchain rescans need to begin for missing wallet transactions.\n"
            "                                                              \"now\" can be specified to bypass scanning, for keys which are known to never have been used, and\n"
            "                                                              0 can be specified to scan the entire blockchain. Blocks up to 2 hours before the earliest key\n"
            "                                                              creation time of all keys being imported by the importmulti call will be scanned.\n"
            "      \"redeemscript\": \"<script>\"                            , (string, optional) Allowed only if the scriptPubKey is a P2SH address or a P2SH scriptPubKey\n"
            "      \"pubkeys\": [\"<pubKey>\", ... ]                         , (array, optional) Array of strings giving pubkeys that must occur in the output or redeemscript\n"
            "      \"keys\": [\"<key>\", ... ]                               , (array, optional) Array of strings giving private keys whose corresponding public keys must occur in the output or redeemscript\n"
            "      \"internal\": <true>                                    , (boolean, optional, default: false) Stating whether matching outputs should be treated as not incoming payments\n"
            "      \"watchonly\": <true>                                   , (boolean, optional, default: false) Stating whether matching outputs should be considered watched even when they're not spendable, only allowed if keys are empty\n"
            "      \"label\": <label>                                      , (string, optional, default: '') Label to assign to the address, only allowed with internal=false\n"
            "    }\n"
            "  ,...\n"
            "  ]\n"
            "2. options                 (json, optional)\n"
            "  {\n"
            "     \"rescan\": <false>,         (boolean, optional, default: true) Stating if should rescan the blockchain after all imports\n"
            "  }\n"
            "\nNote: This call can take over an hour to complete if rescan is true, during that time, other rpc calls\n"
            "may report that the imported keys, addresses or scripts exists but related transactions are still missing.\n"
            "\nExamples:\n" +
            HelpExampleCli("importmulti", "'[{ \"scriptPubKey\": { \"address\": \"<my address>\" }, \"timestamp\":1455191478 }, "
                                          "{ \"scriptPubKey\": { \"address\": \"<my 2nd address>\" }, \"label\": \"example 2\", \"timestamp\": 1455191480 }]'") +
            HelpExampleCli("importmulti", "'[{ \"scriptPubKey\": { \"address\": \"<my address>\" }, \"timestamp\":1455191478 }]' '{ \"rescan\": false}'") +
            "\nResponse is an array with the same size as the input that has the execution result :\n"
            "  [{ \"success\": true } , { \"success\": false, \"error\": { \"code\": -1, \"message\": \"Internal Server Error\"} }, ... ]\n");
    
    RPCTypeCheck(mainRequest.params, {UniValue::VARR, UniValue::VOBJ});