Polynomial Features Memory Usage

Hi guys,

After having a lot of memory issues with PolynomialsFeatures, I modify the transform function in order to significantly decrease the memory consumption. In the example file, the memory consumption of the old and proposed transform functions are compared. The results shown that for the example below, the memory consumption decreases from 3455 MiB to 374 MiB, without increasing the execution time.

I did not know how to erase transform_OLD and make the tests at the same time.

New tests and comparison with #3514 
---------------------------------------------------------------------------------------------
I compare the results (time and memory) of the original, #3514  and #3512. 
```
n_samples, n_features = 100000, 20
X = np.arange(-n_samples, n_samples * n_features - n_samples).reshape((n_samples, n_features))
p = PolynomialFeatures(degree=2)
```
Method | time | memory
----------|-------|-----------
Initial | 9.75 s | 3701.55 MiB
#3514 | 2.26 s | 753.88 MiB
#3512 | 10.8 s | 175.12 MiB

Change in #3512 is less but involve using a `<for i in range(n)>`, other than that is a question of preferring less memory or time.
I make different tests, by changing n_batches
```
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
n_samples, n_features = 100000, 20
X = np.arange(-n_samples, n_samples * n_features - n_samples).reshape((n_samples, n_features))
p = PolynomialFeatures(degree=2)
p.fit(X)
%timeit XP = p.transform(X)
%memit XP = p.transform(X)
```
n_batches | time | memory
----------|-------|-----------
1 | 7.22s | 3701.67 MiB
10 | 7.28 s | 489.95 MiB
100 | 7.21 s | 204.67 MiB
1000 | 6.97 s | 176.78 MiB
10000 | 7.03 s | 176.77 MiB 
n_samples |  8.25 s | 176.93 MiB