feat(session): manage conflicts

When two socket connections (sparks) with the same session ID are opened
(e.g. two browser tabs), instead of overriding the first spark, send a
'sessionConflict' event to the client. When the event is received on the
client, the UI is locked: an information message is shown with a 'Retry'
button.