replaceForRecovery
Replaces the target's key in one atomic step, together with the claim of the recovery's nonce (AuthenticationNonceRepository, same nonces, under the target's address). In this order:
the target has no registration: RecoveryReplacementResult.TARGET_NOT_REGISTERED;
the target's current key was installed by the recovery with RecoveryReplacement.recoveryId: RecoveryReplacementResult.ALREADY_APPLIED, nothing written;
the target's or the authorizer's key or epoch differ from the expected state, or the replacement key is the target's current key: RecoveryReplacementResult.CONFLICT, nothing written;
the target's epoch is Long.MAX_VALUE: RecoveryReplacementResult.EPOCH_EXHAUSTED, nothing written;
prunes nonces older than RecoveryReplacement.pruneBefore and claims the nonce; already claimed: RecoveryReplacementResult.REPLAY (the prune may commit);
stores the replacement key, epoch + 1, the recovery ID and RecoveryReplacement.installedAt as installation time, and clears the rotation ID and the last-device recovery ID: RecoveryReplacementResult.REPLACED.
Nothing else changes: prekeys, mailboxes and other nonces stay. Concurrent calls behave as if they ran one after the other.