Much clearer semantics now. All lists are treated as proplists, meaning
we want to:
1) allow duplicates (providers have to avoid them if they must)
2) preserve order of elements that compare equal (`a == {a, val}`)
through a stable sort (so if `{a, b}` comes before `a`, we keep
`{a, b}` first in the list
3) In two lists of attributes requiring a merge, we always give the
'new' profile a priority to override the default one.