[MAT-387][WIP] Make terminal constructors private and provide factories