Accelerate AffinityPropagation.

Accelerate AffinityPropagation for large inputs using standard tricks (in-place operations and out parameters) to avoid extra allocations.

Basic tests (see below, not in the PR) on datasets for 1000 points in 2D show ~10-20% increase in
speed.

```
import numpy as np
from sklearn.cluster import AffinityPropagation

N = 100
M = 5
np.random.seed(0)
data = np.concatenate(
    [np.random.random((N, 2)) + i for i in range(M)] +
    [np.random.random((N * M, 2)) * M])
print(AffinityPropagation().fit_predict(data))
```
Yes.  See example here:
```
In [1]: a = array([[0, 1], [2, 3]])

In [2]: a[:, [0, 1]]
Out[2]: 
array([[0, 1],
       [2, 3]])

In [3]: a[[0, 1], [0, 1]]
Out[3]: array([0, 3])
```