Introduce `reaver::configuration`, heavily refactor `reaver::logger`.

Average end-user interface did not change (much), introduced statically
typed levels, introduced a way to register them (at runtime, though),
moved default logger from global scope into its own special function
(with function-local static logger), made logger *almost* header-only
(the only non-header-only thing it uses at the moment is
`reaver::style`), introduced the concept of "streamable", so anything
that has operator << for ostreams; the logger refactor was mostly
centered around `reaver::logger::streamable`, which replaced the old
hacky `std::pair<style, std::string>`. Applied the changes introduced by
refactoring to `reaver::exception` related types.