BUG/PERF: Sort mixed-int in Py3, fix Index.difference
- [x] fixes some issues from #13432
- [x] closes #12044
- [x] closes #12814
- [x] tests added / passed
- [x] passes `git diff upstream/master | flake8 --diff`
- [x] whatsnew entry

---
1. Added an internal `safe_sort` to safely sort mixed-integer
   arrays in Python3.
2. Changed Index.difference and Index.symmetric_difference
   in order to:
   - sort mixed-int Indexes (#13432)
   - improve performance (#12044)
3. Fixed DataFrame.join which raised in Python3 with mixed-int
   non-unique indexes (issue with sorting mixed-ints, #12814)
4. Fixed Index.union returning an empty Index when one of
   arguments was a named empty Index (#13432)

Benchmarks (for `index_object` only):

```
]$ asv compare bf47 a02f -f 1.5 -s 
Benchmarks that have improved:
    before     after       ratio
  [bf47    ] [a02f    ]
-  155.66ms    10.32ms      0.07  index_object.index_datetime_set_difference.time_index_datetime_difference
-  154.66ms     2.98ms      0.02  index_object.index_datetime_set_difference.time_index_datetime_difference_disjoint
-  391.45ms    10.65ms      0.03  index_object.index_datetime_set_difference.time_index_datetime_symmetric_difference
-  195.55ms    88.95ms      0.45  index_object.index_int64_set_difference.time_index_int64_difference
-  440.93ms   103.65ms      0.24  index_object.index_int64_set_difference.time_index_int64_symmetric_difference
-    8.77ms     4.88ms      0.56  index_object.index_str_set_difference.time_str_symmetric_difference
```
