inference: refactoring to allow irinterp to perform `:call` inference
This commit implements a significant refactoring of the inference routines,
which is necessary to enable `:call` inference in irinterp. While this
commit does not yet enable `:call` inference, a subsequent small commit
will do so. This is because external `AbstractInterpreter`s first need
to adjust their code for this refactoring, and in the event of a
regression detected by the recursive `:call` inference, we will be able
to simply revert the small commit.
Additionally, this commit improves the robustness of irinterp by
allowing it to handle invoke calls, which currently result in a crash.
TODOs:
- [x] implement a simple recursion detection mechanism for `IRInterpretationState`
- [x] add proper invalidation support
- [x] allow constant inference from semi-concrete interpretation
- [x] propagate callinfo and allow double inlining