Speed optimization: Block do not use their own Index objects
A lot of time is spent in Index.**new** in some computations. I do not think there's an essential need to create Index objects when you could just have an array of integers referring back to the single Index having all the column names for the DataFrame. This would also facilitate renaming as renaming would only need to happen in one place. Definitely not a trivial refactor and would unfortunately break legacy pickles yet again. "For the greater good"
