crimson/osd: cancel ongoing pglog-based recoveries on recovery defering
Previously, we rely on checking `PG::is_recovery()` in
`PGRecevery::start_recovery_ops()` to determine whether it's still valid
to proceed the recovery. This turns out to be inefficient, for example:
1. PG `P` is under recovery, and `PGRecovery::start_recovery_ops()` is
called;
2. PG `P`'s recovery is deferred, and `PGRecovery::start_recovery_ops()`
is blocked on waiting for external replies;
3. Before the arrivals of external replies, PG `P` resumes recovery and
a new round of `PGRecovery::start_recovery_ops()` starts;
4. The external replies arrives and the old
`PGRecovery::start_recovery_ops()` continues as `PG:is_recovering()`
returns true.
In the above case, we get two duplicated recovery ops, which is
incorrect.