I know this calling convention for `k` comes from `mgcv`, but IMO overloading a single argument like this is not so awesome. `bs` (curiously, given that it's older) has a better approach, where `df` and `knots` are separate arguments instead of overloading a single argument -- plus this is the convention that we already implement in our `bs`. Would it be reasonable to switch this to match? Obviously this would require a small amount of adjustment when converting from mgcv, but I think people will figure it out.

If we do this, then I'm not sure how the boundary knots should be handled -- `bs` treats them specially, with `knots=` only for interior knots, and `lower_bound=` and `upper_bound=` for exterior knots. I could be convinced that this distinction is silly or unhelpful, but it does seem to make sense in particular for `cc`, where someone might well want to specify the boundaries explicitly while keeping automatic selection of the interior knots.