In a large enough pot, bring water to a rolling boil. Add at least 1/2 tablespoon salt to the water. Once boiling, add the pasta and stir, cooking to al dente, about 8-10 minutes. Expect to see foam in the pot. Once finished, strain the pasta and rinse with cold water. Set aside.
While the pasta boils, make a roux by melting butter on a pan over medium heat, then adding flour. Stir with a wooden spoon in figure 8 motions until puffed slightly, aout 3-5 minutes. Add seasonings, stir, and cook for another minute. Pour in milk, half and half, and dijon mustard, then bring the stove to medium high heat. Cook until the sauce has thickened, about 5-8 minutes.
Remove the sauce from the heat and let cool for about 1 minute before adding the cheeses. Stir until smooth and combined, then add the pasta, folding until it's all coated with the cheese sauce. Taste and adjust seasonings to your liking. Serve warm with toppings, if desired.