feat: decouple configs from algorithms and provide `new` methods to avoid invalid state
Previously, if you forgot to set an initial starting point or a set of walkers or a distribution of particles, some algorithms would just panic. We can instead prevent invalid state by refusing to provide a constructor for a config which is invalid, i.e. removing many of the `Default` implementations for configs. Since we always call `with_x0` or similar methods after `default()` anyway, this makes the syntax less verbose and makes it much more clear to the user what is required.
fix: remove `kmeans` dependency and implement the algorithm by hand
`kmeans` is fancy but uses SIMD features that are only available on nightly, and there's no way to opt out. I don't want to require people to use experimental features to use this crate, and the algorithm for K-Means is not that difficult to implement, so I just did it myself.