Use a top-down version of fromList

Ross Paterson came up with a version of fromList that avoids the
tree rebuilding inherent in the `(|>)`-based approach. This
version is somewhat strictified and rearranged. It reduces
allocation substantially over the old version. Mutator time goes
down too, but for some reason GC time rises to match it.