This was prompted by the revived physics extension. Extensions can drop a lot of variables into the user namespace. Ideally, if the extension is unloaded, those variables should disappear, but only if the names haven't been rebound.
This works as a counterpart to ip.push(). The idea is that an extension can work like this:
myvars = dict(a=foo(), b=bar(), c=baz())
Add drop_by_id method to shell, to remove variables added by extensions.
merged with rebase to avoid recursive merge for just one commit. thx!