Introducing sanitizer callbacks in transport layer

Currently, there is no sanitization of the incoming data. A malicious node or a bug in our side could end up with a message that crashes all connecting nodes. I believe issues #659 and #655 exist because of accepting unprepared data.

Please note that this PR does not sanitize the messages in the transport layer but it does the first step by introducing sanitizer callbacks that need filling. A sanitizer callback will be executed before the actual callback and its purpose is to make sure that the incoming messages are well-formatted (for example, the right keys exist, it is fixed-length, it contains valid data). Every callback should strictly come with a sanitizer.
Just a style note: lists are typically used to denote mutable collections, i.e collections that may grow or shrink. For immutable collections, it is best in terms of both style and speed to use a tuple:
```python
keys = ("pubkey", "nickname", "signature")
```