text: Title: Metadata propagation not reliable if object type changes
  Body: We currently rely on Pandas's [__finalize__](https://github.com/pandas-dev/pandas/blob/master/pandas/core/generic.py#L5179) to propagate the _metadata (including computed metadata, recommendations, and other stored properties). However, there are situations where dataframes don't always stay the same type throughout various operations. For example, in this [issue](https://github.com/lux-org/lux/pull/59#issuecomment-674100795), when we do group by. We end up with a GroupBy object, and the `_metadata` is lost. Similar issues will occur when going from Pandas Dataframe --> Series. 
  We should find a better strategy for metadata maintenance without having to explicitly pass in __finalize__, or ensure that when metadata properties are retrieved that they trigger a metadata recomputation if unfresh (so that the system is slightly slower but doesn't break when the metadata fields are accessed).
  
  ```python
  df = pd.read_csv("lux/data/car.csv")
  groupby_result = df.groupby("Origin").agg("sum")
  intermediate = groupby_result.reset_index()
  intermediate.cardinality # this returns None
  df = intermediate.__finalize__(df)
  df.cardinality # cardinality is now populated again
  ```