Use an executor in `mqtt::session` class

This makes possible to have a pseudo-infinite loop of request processing
without causing stack overflow errors.
Extract message decoder selector to `codecs.hpp`

Instead of switching-casing in `mqtt::session` implementation.
Remove dup of `tcp-server-it.cpp` file
Split tests into unit & integration
Rename `invalid_X` exceptions to `bad_X`

According to the style of standard library.