app tests use run-sync! instead of run-script

After introducing queues and asynchronous message processing, we added
a call to Thread/sleep to the run-script function to get the tests
working again. This was a temporary solution and led to intermittent
test failures.

A test function named run-sync! was created to ensure that all
messages have been processed before continuing with a test. This
change uses run-sync! everywhere that run-script was used and removes
run-script.

The run-sync! function was updated to return all intermediate states
of the app instead of the boolean true. The states are useful for
tests and are still truthy.

run-sync! was also updated to work when a script's last message is used
earlier in the script.