I've got it running by inserting this at the beginning of first loop in your move() function:
If LiveView is already on, lv.start() will do nothing.
If you are in image review mode, lv.start() will bring you back to LiveView (without waiting for the image review to finish).
If you call it while Canon firmware is already attempting to return to LiveView (e.g. immediately after taking a picture with image review off), you have a race condition. ML notices the camera is not in LiveView, so it queues a fake press on the LiveView button. Meanwhile, Canon code might enable LiveView. By the time the LiveView button press gets interpreted, the camera is likely already in LiveView, so the effect will be the opposite.
Hence the delay before attempting to start LiveView.
That's because camera.shoot() does not also wait until the camera returns to LiveView. It only waits until Canon firmware reports the picture has been taken (so you can take a second picture or change settings straight away). LiveView is a different task.