Implement freeze, unfreeze and final in base ParamBuilder class
.freeze() will return a FrozenParam<T extends ParamBuilder> which has only one method .unfreeze() that returns T (back to the initial ParamBuilder type).
.final() is a more extreme variant FinalParam<T> where T is the same T in ParamBuilder<T> and has no methods (no way to "un-finalize" a FinalParam).
Discussion
Should
FrozenParams have.clone()available? If so would the clone be frozen too?