The livetime of a ScriptInterface is nested within the livetime of it's ScriptContext. The ScriptInterface doesn't have to manage the livetime of it's ScriptContext.
Since ScriptInterface::GetContext can't return a std::shared_ptr<ScriptContext> (it doesn't have ownership) there are many followup changes.
More use of std::shared_ptr<ScriptContext> can be removed but this diff is big enough.