try to optimize islist/isnum/... (not helpful yet)

the problem is that islist and friends also include a null
check on their argument. At best, we could - if we only know
the type - turn these ops into a negated "isnull" op, but that
doesn't exist. So we have to wait for spesh's ability to
allocate new registers and add new operations on those.
Add lexical lookup lifetime hinting ops.

Allow us to convey that a given lexical lookup can be relied on to
always resolve to the same thing, or can be relied on to resolve to
the same thing per invocant type. The former is useful for setting
sub lookups, the latter for type variables. For now don't do anything
extra, but spesh will be able to improve on this.
Speculate some speculative optimization spesh ops.
Add slots related to logging things we saw.
Re-organize spesh to have log/specialize phases.

When we first decide to specialize, we now only go so far as creating
argument guards. There is a place for logging instructions to be added
(though none are being yet). This information will then be available
when we reach specialize time, to guide specialization.
Implement sp_log op.
Start inserting logging instructions.
Correct log slot marking.
Fix scoped/lifetimed lexical lookup opts.
Add missing write barrier after spesh.
getlexstatic_o optimization.
Be more careful with no-handler frames.
Better error on handler fixup failure.
Implement some basic guard ops.

Untested, since nothing emits them yet.
First pass at turning some logs into fact+guard.
Fix dumping of deopt annotations.
Read correct log entries.
Break out different kinds of de-opt point.

Can have "current frame only" for failed guards, and "all" for when
mixins happen that may invalidate many assumptions.
Record deopt annotations per deopt kind.
Migrate deopt-1 annotations to sp_logs.

The log will be replaced with the guard, which is what will trigger
deopt.