More recommendations.
Add custom equality for optimization attempts.

Necessary because these are part of cyclic structures (i.e. they point
to their parent event, which contains them).

No especially pretty, but can't think of a better way off the top of my
head.

This could come in handy when implementing (pretty much any kind of)
merging, e.g. merging identical optimization events from different
compiles.
Update coach to use profile-driven instrumentation.

Currently does some basic profiling-based pruning. Only produces reports
about the hottest N compiles (i.e. versions of functions that ran the
longest).

Produces the same kinds of reports as before, with the exception of
temporal pattern-based reports (flip-flops and regressions) which don't
make sense when we only keep some of the compiles.

Still need to update readme and instructions to explain the new way to
gather data.
Update instructions for profile-driven coach.