[WIP] Added kernel weighting functions for neighbors classes

This patch enables the use of kernel functions for neighbors weighting.

It adds the following keywords for ``weights`` argument: ``tophat``, ``gaussian``, ``epanechnikov``, ``exponential``, ``linear``, ``cosine``, i.e. all kernels presented in ``KernelDensity`` class.

For ``KNeighborsClassifier`` and ``KNeighborsRegressor`` the kernel bandwidth is equal to the distance to the k+1 nearest neighbor (i. e. it depends on a query point).

For ``RadiusNeighborsClassifier`` and `` RadiusNeighborsRegressor`` the kernel bandwidth is equal to the radius parameter of the classifier (i. e. it is constant).

Please, take a look.
Duplications are not good, but I don't see a better way here.

For `bandwidth` in `_get_weights` we can pass an array (for NearestNeighbor) or single value (for RadiusNeighbor) — the usage is case dependent. Also there is small logic for discarding the last `neigh_ind` row.

I can modify `KNeighborsMixin.kneighbors()` such that it will return `neigh_dist`, `neigh_ind` and `bandwidth` (depending on `self.weights`.) But it seems bad.

Refactoring this into a new helper function in `base` also seems excessive.