Remove struct_id and just use the name.  It is suitably unique and shared with the rest of the methods that need to be.
New method of specifying context: get_context()

This is much cleaner than shoehorning a new argument for all nodes, we
just define an extra optional method for Ops and have a bit of utility
code in Apply.

As a bonus, this also make context passing optional and will not add
any overhead for Ops that do not use a context.
New context registery and switch things to use the new context mechanism from the last commit.