Disallow config source contain anything but the root object.

1) It sounds reasonable.
2) Actually I don't have a choice, because config_t::parse may read little more from the stream than exactly one JSON object (it may if you didn't know). It's hard to make useful API with this property.
3) It's how it works now everywhere.
Some documentation for config_parser_t.
Throw only parser errors from config_parser_t::parse.

When the JSON in the config is an array, it's also a format error, and it's better to report this error with config_parser_error_t exception.
More documentation for config_parser_t.
Documentation for config_t exceptions.
Documentation for config_t.
Hide little more implementation details.

Why somebody may want to derive from config_t and access its data members? idk lol