Mismatch in Series/DataFrame boolean ops behavior
Based on `test_bool_ops_df_compat` from `tests.series.test_operators`:

```
s1 = pd.Series([True, False, np.nan, True], dtype=object)
s2 = pd.Series([True, True, False, np.nan], dtype=object)

>>> s1 & s2
0     True
1    False
2    False
3    False
dtype: bool

>>> s1.to_frame() & s2.to_frame()
       0
0   True
1  False
2    NaN
3    NaN
```

The DataFrame behavior strikes me as More Correct.  Is the mismatch intentional?