ENH: Sparse int64 and bool dtype support enhancement
- [x] closes #667, closes #8292, closes #13001, closes #8276, closes #13110
  - [x] tests added / passed
  - [x] passes `git diff upstream/master | flake8 --diff`
  - [x] whatsnew entry

Currently, sparse doesn't support `int64` and `bool` dtypes actually. When `int` or `bool` values are passed, it is coerced to `float64` if `dtype`kw  is not explicitly specified. 

**on current master**

```
pd.SparseArray([1, 2, 0, 0 ])
# [1.0, 2.0, 0.0, 0.0]
# Fill: nan
# IntIndex
# Indices: array([0, 1, 2, 3], dtype=int32)

pd.SparseArray([True, False, True])
# [1.0, 0.0, 1.0]
# Fill: nan
# IntIndex
# Indices: array([0, 1, 2], dtype=int32)
```

**after this PR**

The created data should have the `dtype` of passed values (as the same as normal `Series`). 

```
pd.SparseArray([1, 2, 0, 0 ])
# [1, 2, 0, 0]
# Fill: 0
# IntIndex
# Indices: array([0, 1], dtype=int32)

pd.SparseArray([True, False, True])
# [True, False, True]
# Fill: False
# IntIndex
# Indices: array([0, 2], dtype=int32)
```

Also, `fill_value` is automatically specified according to the following rules (because `np.nan` cannot appear in `int` or `bool` dtype):

Basic rule: sparse `dtype` must not be changed when it is converted to dense. 
- If `sparse_index` is specified and data has a hole (missing values):
  - `fill_value` is np.nan
  - `dtype` is `float64` or `object` (which can store both `data` and `fill_value`)
- If `sparse_index` is None (all values are provided via `data`, no missing values)
  - if `fill_value` is not explicitly passed, following default will be used depending on its dtype.
    - `float`: `np.nan`
    - `int`: `0`
    - `bool`: `False`
