Enforce parameter preconditions on information contracts (public API).
Favor AttrName over String.

Using String for attribute names is a little bit dangerous because
it might lead to an ambiguous API in the long run. This commits
removes usage of String-driven APIs for attribute names, mostly
to see what it costs in terms of user convenience. IMO, we should
introduce convenience method carefully in a second round and keep
the suggested public API as unambiguous as possible first.
Document AttrList a bit more and add information contracts to it.
Put some order in DSL and systematically delegate to factory methods.