I have some questions to make, before I could actually answear your question
Why don't you use:
var currentScene = get_tree().get_current_scene()
Also the SceneTree class has the function you're coding already:
SceneTree.set_current_scene (Node child_node)
You can pass a PackedScene as argument as well, since a PackedScene is a saved Node.
and the you can simplify your code:
onready var scene = load (Resource.get_path()) #you can set a exported variable to use as argument for that
#if you want to, take a look in the video I make yesterday, like in the end of the comment
var tree = get_tree()
tree.set_current_scene(scene)
var currentScene = tree.get_current_scene()
Also I wouldn't recommend by any means that you add a child directly to the root
, but you can add it to the first root child, the trunk node (the first node of the scene) of the current scene, that's because having 2 trunk nodes can create everykind of strange behaviours.
So you can make it this way:
tree.get_root().get_child(0).add_child(currentScene)
And to connect the signal you can connect it as simply as possible:
var nodeThatWillBeConnected = get_node(NodePath)
nodeThatWillBeConnected.connect(..........................the arguments for connect the signal................)
Now to solve the overall process and to actually answear your question:
You can use a Singleton to hold a function that will receive the signals from the nodes you're instancing.
The Singleton won't change, either be reproccessed, until the game actually is closed.
So you can have a structure like that:
SingletonNode
root
|currentScene
|otherNodes
You can watch the video here, with EN-US subtitles