Refactor the predicate story a bit; predicates now get additional
information - a calculation function and a default. order is gone
and dependent on list order again. default is used when explicit precalc
is passed in and a key is missing.