[MRG+1] don't set trailing "_" attrs in __init__

As I said over at gh-3627, 

> we need to fix all the `__init__`s that set final-underscore attributes. Some of them set those to None or similar values. [...] we should do a systematic search of the codebase and introduce a smoke test.

I did just that.

Note: code uses `getattr(self, "someattr_", None) is None` instead of `hasattr`, in an attempt to be backwards compatible with pickled estimators that have these attributes. I'm not sure how important that is (who would pickle before fit?) and unpickling is not tested.
I don't think this is well-founded. A descriptor attribute will register as `hasattr` returning false if its `__get__` raises an `AttributeError`. All of these definitions should, in theory, do that, because they rely on reference to attributes that after this PR should raise an `AttributeError`. So, for example, `hasattr(BernoulliNB(), 'coef_') == False` at master.

The exception is where it would be breaking backwards compatibility to, for example, change an existing error from a `ValueError` to an `AttributeError` (although perhaps we could define a custom `BackwardsCompatibleAttributeError` that extends `ValueError` and `AttributeError`!).

If this list must exist, there should also be a test to ensure that it is a minimal listing of properties that *do not* raise `AttributeError`. This would remove `BernoulliNB().coef_` for instance.