REF/ENH: Refactor NDFrame finalization
In preperation for https://github.com/pandas-dev/pandas/issues/27108
(disallowing duplicates), we need to enhance our metadata propagation.

*We need a way for a particiular attribute to deterimine how it's
propagated for a particular method*. Our current method of metadata
propagation lacked two features

1. It only copies an attribute from a source NDFrame to a new NDFrame.
   There is no way to propagate metadata from a collection of NDFrames
   (say from `pd.concat`) to a new NDFrame.
2. It only and always copies the attribute. This is not always
   appropriate when dealing with a collection of input NDFrames, as the
   source attributes may differ. The resolution of conflicts will differ
   by attribute (for `Series.name` we might throw away the name. For
   `Series.allow_duplicates`, any Series disallowing duplicates should
   mean the output disallows duplicates)

- [ ] Closes https://github.com/pandas-dev/pandas/issues/8572
- [ ] Update existing calls to `__finalize__ ` to pass through `method`
- [ ] profile / Run ASV
