Cook the pasta: Bring a large pot of salted water to a boil and cook the elbow macaroni until just shy of al dente, about 7 minutes. Drain well and set aside.
Melt the butter: In the same pot over medium heat, melt the butter until it foams slightly. Keep the heat steady so it doesn't brown too fast.
Make the roux: Whisk in the flour and cook for 1-2 minutes, stirring constantly, until it turns pale gold and smells nutty. This step keeps the sauce from tasting raw or pasty.
Add the milk: Pour in the milk gradually, whisking the whole time to prevent lumps. Keep whisking until the mixture is completely smooth.
Simmer the sauce: Let the sauce bubble gently over medium-low heat for 4-5 minutes, stirring often. It's ready when it coats the back of a spoon thickly.
Remove from heat: Take the pot off the burner before adding cheese. This keeps the sauce smooth instead of grainy.
Stir in the cheese: Add the shredded cheddar a handful at a time, stirring until fully melted between additions. Mix in the Dijon mustard, garlic powder, and onion powder.
Season to taste: Taste the sauce and add salt and black pepper as needed, keeping in mind the cheese already adds some saltiness.
Combine with pasta: Fold the drained macaroni into the cheese sauce, stirring until every piece is coated and glossy.
Serve immediately: Spoon the mac & cheese into bowls right away while it's hot and creamy, since the sauce thickens as it cools.