OSD: use PGRef in consume_map

Signed-off-by: Samuel Just <sam.just@inktank.com>
PG: use PGRef in QueuePeeringEvt

Signed-off-by: Samuel Just <sam.just@inktank.com>
OSD: use PGRef in handle_pg_stats_ack

Signed-off-by: Samuel Just <sam.just@inktank.com>
OSD: use PGRef in handle_pg_remove

Signed-off-by: Samuel Just <sam.just@inktank.com>
ReplicatedPG: use ReplicatedPGRef for C_OSD_OpApplied

Signed-off-by: Samuel Just <sam.just@inktank.com>
ReplicatedPG: use ReplicatedPGRef for C_OSD_OpCommit

Signed-off-by: Samuel Just <sam.just@inktank.com>
ReplicatedPG: use ReplicatedPGRef for C_PG_MarkUnfoundLost

Signed-off-by: Samuel Just <sam.just@inktank.com>
ReplicatedPG: use the ReplicatedPGRef typedef

Signed-off-by: Samuel Just <sam.just@inktank.com>
common/: add tracked_int_ptr.hpp

TrackedIntPtr acts like intrusive_ptr, but is able to
track a ref id.

Signed-off-by: Samuel Just <sam.just@inktank.com>
osd/: optionally track every pg ref

This involves three pieces:

For intrusive_ptr type references, we use TrackedIntPtr instead.  This
uses get_with_id and put_with_id to associate an id and backtrace with
each particular ref instance.

For refs taken via direct calls to get() and put(), get and put now
require a tag string.  The PG tracks individual ref counts for each tag
as well as the total.

Finally, PGs register/unregister themselves on construction/destruction
with OSDService.

As a result, on shutdown, we can check for live pgs and determine where
the references are held.

This behavior is compiled out by default, but can be included with the
--enable-pgrefdebugging flag.

Signed-off-by: Samuel Just <sam.just@inktank.com>