Preheat oven to 400ºF.
Prepare a 13" x 9" pan by spraying with olive oil, you can also use a round casserole dish, you just won't get as much crunchy topping!
Bring a large pot of salted water to a boil over high heat.
Add pasta and cook until slightly under-cooked, very al dente (the pasta will cook more in the casserole).
Rinse and drain pasta and set aside.
In a large saucepan, melt the butter over medium low heat.
Add the flour and whisk until a roux forms (approximately 6 minutes over medium low heat). I use a whisk to start then switch to a rubber spatula. This mixture should not brown, you just want to cook the rawness out of the flour.
Slowly add the milk, continuing to stir until combined. Bring this mixture to a simmer over medium heat, stirring. You really shouldn't leave this mixture, it needs to be tended.
Add the cheddar cheese about a cup at a time, stirring. Add the next batch of cheese when the first is mostly melted. Continue stirring until the cheese is melted.
Add salt and pepper to taste.
Pour the cheese mixture over the noodles and stir to combine.
Pour mixture into the prepared pan.
Mix together the Parmesan cheese, butter and bread crumbs until crumbly. I do this with my fingers, just smush it all together.
Sprinkle over the top of the casserole dish.
Bake for 30 to 45 minutes until top is browned and mixture is bubbling.
Remove from oven and cool for about 10 minutes before serving.