For the parent task, we need to implement support for expiring recovery codes at all. "Normal" recovery codes, which are generated by the user for themself, should remain valid indefinitely.
Acceptance criteria
- Expiring recovery codes can be used to log in to the account only before their expiration time.
- Expiring recovery codes are not listed (nor downloadable) on Special:AccountSecurity.
- Expiring recovery codes are single-use.
- Expired recovery codes are removed from the database as soon as any write operation happens to the user's recovery codes (e.g., other code was used).
- Expiring recovery codes are also removed when the user is regenerating their codes.