Refactor from_records to load data in an efficient way
Based on the SciPy sprint discussions, and the discussions on related issues, seems like `from_records` should be the pandas way to create a `DataFrame` from row based data.

The current signature is next:
- ```def from_records(cls, data, index=None, exclude=None, columns=None, coerce_float=False, nrows=None):```

And it currently supports input `data` as:
- dict
- numpy.ndarray
- DataFrame
- Iterable of list
- Iterable of tuple
- Iterable of dict

What I propose is to make `from_records` only work when `data` is an iterable of array-like (list, tuple, np.array...) or an iterable of dict. And deprecate the other cases (dict and DataFrame). After searching on GitHub repos and blogs, couldn't find cases where it's used with dict or DataFrame, and IMO the DataFrame constructor is a better way for those cases. This would make the code simpler.

Then, I'd add a new parameter `dtypes` expecting a list or a dict with the dtypes of the new DataFrame. With this, and for the case when `data` is a generator, and `nrows` and `dtypes` are specified, we wouldn't need to exhaust the generator and load it to Python structures. Meaning that we'd just need to allocate the DataFrame memory, and there wouldn't be any intermediate memory requirements.

Related issues: #5902, #2305, #2193, #4464, #1794, #13818.

@wesm, @jreback, @jorisvandenbossche any comments? Are you ok with this approach and the proposed changes to the API?





