I'm tempted to keep this strictness, because half the time those unexpected properties are a syntax error. Not a syntax error for KDL, but a syntax error for iocaine's use of KDL.
For example, bind @iocaine.socket "127.0.0.1:42069" is valid KDL, but bind requires a string, not a Vec...
...come to think of it, the other config sources would also bail in this case, because this would fail to deserialize. They'd accept and ignore unknown keys, though. Perhaps I should do that: ignore unknown keys, including unknown properties, as long as other invariants hold.
bind "127.0.0.1:42069" "@iocaine.socket would still be an error, but handler "/some/path" foo=bar would not: bind requires a single string, handler accepts properties - we just ignore the unknown ones. Consequently, handler "/some/path" "/foo/bar" would also need to fail, because only a single positional argument is accepted.