[debugger] Allow async fingerprint computation.

Previously the Stack() would compute fingerprints for frames it had and
required callers to have syned enough frames for this computation to
succeed. This made it hard both to track when a fingerprint can be
computed and to asynchronously request them since the stack can change
during a sync.

This patch adds a new async function on Stack for getting a fingerprint.
It handles the cases where the requested frame was moved or destroyed
during the async call.

It makes the normal fingerprint computation able to report a failure
rather than DCHECK so that calling code doesn't have to reason about
whether fingerprint computation is possible.

Updates existing callers for the new std::optional return value.
Currently all callers only request fingerprints when they know the
fingerprints are valid, so we can assume that the return value is valid.

TEST=unit

Change-Id: Iae435e18a0268eac02ae268b13e76edaa6901917
15 files changed