[MRG] Avoid duplicated methods whenever possible + more robust parameter passing

The main goal of this pr is to ease maintenance.
I've actually been removing this idiom in various places (maybe this exact module). It defeats the use of inheritance by mixing the subclasses' logic in the base class.

If you want to de-duplicate the docstrings, you can use the template method pattern:

```python
def staged_predict(self, x):
    """docstring"""
    return self._staged_predict(x)
```

This way, if you want to understand one subclass's logic, you don't have to disentangle it from the other's.