> Somewhat subjective point, but if we want to fail hard on invalid arguments, shouldn't we do it at constructor time and not at fit/transform (i.e., fail hard and fast)?

Probably, but validation upon construction is insufficient; we need to validate it upon fitting due to `set_params`, etc. Most of the code currently only validates upon fitting, but there is some inconsistency.