Use typed exceptions in vibe.data.json and vibe.http.websocket

Using subclasses of Exception allows for easier error discrimination.
For instance it is very common to catch the exception thrown by a WebSocket while waiting in receive() and just silently return from the handler function, or catch the exception thrown while parsing the received data and answer with a an error message along the lines of Bad Request.

Throwing subclasses of Exception should not have any negative impact since existing catch blocks will work anyway.