Add exponential falloff to kernel reconnect

- reconnect tries after 2, 4, 8,...,64 seconds
- gives up after last attempt, setting new `Connection lost` notification
- clicking `Connection lost` triggers reconnect
- add `Reconnect` to Kernel menu
I'm not sure about the logic here. It tries to reconnect in any case where the websocket is closed, but it only increments the reconnect attempt counter if it closed because of an error. Presumably, if the websocket is closed without an error, it shouldn't go on trying to reconnect endlessly?