[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.
> Unfortunately it occurs with RadiusNeighborsClassifier: the number of
> neighbors is not fixed and numpy can't convert an array of different
> size arrays to a 2-D array. I don't know what we can do with that.

OK, as long as it is hidden inside our codebase, and not open to users to
inject some of that code. I also think that a comment here explaining
when this case happens would be great.