BUG: GroupBy.count() and GroupBy.sum() incorreclty return NaN instead of 0 for missing categories
- [x] closes #31422 
- [x] closes #35028 
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

*Behavioural Changes*
Fixing two related bugs: when grouping on multiple categoricals, `.sum()` and `.count()` would return `NaN` for the missing categories, but they are expected to return `0` for the missing categories. Both these bugs are fixed.

*Tests*
Tests were added in PR #35022 when these bugs were discovered and the tests were marked with an `xfail`. For this PR the `xfails` are removed and the tests are passing normally. As well, a few other existing tests were expecting `sum()` to return `NaN`; these have been updated so that the tests now expect to get `0` (which is the desired behaviour).

*Pivot*
The change to `.sum()` also impacts the `df.pivot_table()` if it is called with `aggfunc=sum` and is pivoted on a Categorical column with `observed=False`. This is not explicitly mentioned in either of the bugs, but it does make the behaviour consistent (i.e. the sum of a missing category is zero, not `NaN`). One test on test_pivot.py was updated to reflect this change. 

*Default Behaviour*
Because `df.groupby()` and `df.pivot_table()` have `observed=False` as the default, the default behaviour will change for a user calling `df.groupby().sum()` or `df.pivot_table(..., aggfunc='sum')` if they are grouping/pivoting on a categorical with missing categories. Previously the default would give them `NaN` for the missing categories, now the default will give them `0`.

What is the appropriate to highlight/document this change to the default behaviour?
@jreback I've made another attempt using a different approach. Check out #35241 

(I'm more thrilled with #35241 right now, so will mark this one as draft, expecting we'll decline it later.)