Invalidation log: store full edge info
This changes the format of the invalidation log consumed by
SnoopCompile. The aim is to give SnoopCompile complete information:
- for backedge-based invalidations (`gf.c` invalidation), we log both
the `invokesig` (if present) and the `caller` in all cases.
- for forwardedge-based invalidations (`staticdata.jl` invalidation), we
log `caller` and the index of the first entry of the edge in
`caller.edges`. This forces SnoopCompile to know how to handle all
edge types, but ensures that nothing is lost.