Drop the config_t::assert_* methods in favor of the to() method.

Because it's good that all exceptions about wrong type are thrown from one place by one code.
Derive all conversion exceptions from the proper type.
Perform even more type checks via the config_t::to() method.

Now all the error messages have the same format because are generated in the same place.
The config_t::size method looks kind of obfuscated, and it would not pass my own review, but fortunately nobody reviews my code.