PERF: construct DataFrame with string array and dtype=str
Avoid inefficient call to `arr.astype()` when dtype is `str`, and use ensure_string_array instead.

Performance example:

```python
>>> x = np.array([str(u) for u in range(1_000_000)], dtype=object).reshape(500_000, 2)
>>> %timeit pd.DataFrame(x, dtype=str)
391 ms ± 17.7 ms per loop  # master
11.9 ms ± 131 µs per loop  # after this PR
```

xref #35519, #36304 & #36317.

Nice! Add a benchmark for it? 
And is this speed-up only for constructing from an array, or also eg from dict `{'col': x}` ? > And is this speed-up only for constructing from an array, or also eg from dict {'col': x} ?

This PR just affects the path for multi-dimensional arrays, while `{'col': x}` takes the 1-dim path, so not affected by this. The one dim-path was however helped by #36317.
 > Nice! Add a benchmark for it?

Yeah, I'll add it after the travis checks work again.
 Updated and added ASVs. thanks very nice!