DF.__setitem__ creates extension column when given extension scalar
This PR is in response to [Issue 34832]( https://github.com/pandas-dev/pandas/issues/34832).
These changes follow the suggestions from reviewers on the PR to fix an issue where `df['a']=pd.Period('2020-01')` would create an object column instead of a `period[M]` column.

One potential issue that I see with these changes is that this code requires the `shape` parameter passed into `cast_scalar_to_array` to be an int, even though the functions docstring claims that it accepts a tuple.

I'm happy to work on resolving that issue, but first wanted to clarify that it is necessary. Based on my perspective, there would be no reason to call this function to create a multi-dimensional array, but I surely don't understand the full interconnectivity of this package.

- [x] closes #xxxx
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry
