Add realtime playback functionality
Add realtime playback functionality

This adds a button to the `jupyter_replay` widget that attempts to replay
the experiment in real-time. It advances the current state in a loop
controlled by a thread. At the end of each iteration the amount of wall
time that has passed is used to determine the next state to restore up to.
A thread is used to ensure the kernel remains responsive, allowing the user
to pause the replay, which causs the thread to error out.

jcpeterson/Dallinger,Dallinger/Dallinger,Dallinger/Dallinger,jcpeterson/Dallinger,jcpeterson/Dallinger,Dallinger/Dallinger,Dallinger/Dallinger,Dallinger/Dallinger,jcpeterson/Dallinger,jcpeterson/Dallinger