BUG: fix bool no-op replace calls
closes #6332

@jreback look okay to u?
 why does this work?
 For the same reason I mentioned in #6332. `np.atleast_1d` is a call to `array` plus some insurance that you get at least a 1D array. Using the SO example, that will create an array of one string. `S` dtypes cannot be safely cast to `bool` therefore I pass in the array of strings which will ultimately raise `ValueError` in `mask_missing` which will convert them to `object` dtype. Then `mask_missing` procedes to compare each non NA value with those in `arr`. Since no strings are equal to `True` or `False`, the mask is an array of `False`s. Does that suffice?
 `dict`s work too

```
In [18]: s
Out[18]:
0     True
1    False
2     True
dtype: bool

In [19]: s.replace({'asdf': 'asdb', True: 'a'})
Out[19]:
0        a
1    False
2        a
dtype: object

In [20]: s.replace({False: 'asdb', True: 'a'})
Out[20]:
0       a
1    asdb
2       a
dtype: object
```

If there's no test I'll add one
 One thing that won't work as "expected" is `df.replace({True: False, False: True})`. The keys are iterated over in an arbitrary order and you'll end up with either all `True`s or all `False`s. I don't really think this is that common.
 merge away

neat trick with atleast1 d
