osd: pg: be more careful with locking around forced pg recovery
This does several little things that add up to big concurrency and safety
improvements:
* Switch to passing around PGRefs instead of raw pointers, which is
generally a good idea
* drop the pg_map_lock once we're done looking up the PGRefs, since
we don't need it and holding the PG pointer alive was the only previous
thing that might have made it necessary
* don't hold the recovery_lock since we don't need any OSD-level
synchronization
* make sure the PG is not being deleted before we do a force-change of its
state