The parsing of column array data was in Core,
but was parsed into three different forms:
1) for column access from Core's get('columns.<key>')
2) for column prep for header rendering
3) for column prep for body rendering
Now the columns are passed to the views to do with as
they will, and Core only does what is needed for #1.
Also, parsing nested headers efficiently is a pain in
the ass. The 'children' config doesn't allow implementers
to choose which cells get rowspan when the number of
header rows is greater than the number of column descendant
levels. As is done in 3.4.1, parent cells are always
rowspan 1. I prefer to have data related columns have
rowspan 1, but the logic to support that with the "children"
config would be crazy complex. Implementers can move stuff
around in `table.head.columns` before `render()` if they want
different cell placement and spanning.