Update ProgramManager

The program manager's run function now takes variatic program arguments
instead of a table.

Also, ProgramManager.main() will override Thread.new so that any new
threads which are spawned are added to the thread stack.