Room position optimisation: Solve one system for each connected component.

Fixes unconstrained ("free") rooms being moved to 0, infinity,
or whatever the least squares solver picks for free variables.
Make the use of `catchSingular` more granular