Handling webcam disconnect mid-read - the opencv function to fetch the frame simply never returns, even though the documentation advertises it will return null/None.

Reading is now done in a thread, and if that thread doesn't respond for more than {timeout} time, we kill the process.

Recovering would be nice, but python threads aren't easy to force-kill. I'll look at that later (maybe I can raise an exception in the camera-read thread)