I think that should work. I generally just use a simple timer in code in _process
for level changing, rather than a timer, but the gist is the same regardless.
As for the issues, it seems both issues are caused by trying to disconnect a signal that is not there. You may want to add the following condition before calling disconnect
(discovered thanks to this Reddit post):
if transitionover.is_connected("timeout", singleton, "levelloader"):
transitionover.disconnect("timeout", singleton, "levelloader"
transitionover.connect("timeout", singleton, "levelloader", [value1, value2])