RuntimeNodes are a bit schizophrenic. They are both a high level construct and a low level construct at the same time. It's probably wrong to introduce them in Lower already, as later analysis can turn e.g. an Object + int add into an int + int add, which really did not require the runtime node at all. They are also nasty to work with in that they have an arbitrary number of arguments, and the argument count is dependent on its node type.
I suggest that we get rid of them altogether and implement enter/exit visitors for their respective requests in CodeGenerator instead. This significantly shortens Lower, and I don't think the additional logic in codegen is much worse than what we alredy have.
Of course the runtime node generator for specializations will remain.