Preheat the oven to 350°F and spray a large (9x13") baking dish with non-stick cooking spray.
Cook the elbow macaroni in a large pot of boiling salted water until al dente- about 1-2 minutes less than the package directions. Drain the macaroni in a large colander and drizzle with olive oil to prevent the pasta from sticking together. Set aside.
Meanwhile, grate the cheese. Set aside 2 cups of grated cheddar cheese and ½ a cup of shredded mozzarella cheese in a separate bowl (to be used as the cheese topping. Combine the remaining cheese and set it aside.
Melt the butter in a large saucepan or Dutch oven over medium heat. Whisking continuously, sprinkle the flour in with the melted butter. Continue to whisk until smooth and no dry patches of flour remain- about 1 minute.
Slowly whisk in the milk with the butter/flour until smooth and fully incorporated. Add the half-and-half and continue to whisk over medium heat until thickened (do not allow the mixture to boil).
Remove from heat and stir in the salt, pepper, and garlic powder (optional). Stir in the grated cheese (except for the cheese that is reserved for topping). Stir until combined.
Add the cooked elbow macaroni to the cheese sauce if the saucepot you used to prepare the cheese sauce is large enough, otherwise, combine the macaroni pasta and the cheese sauce in a separate larger bowl. Mix well and season with additional salt and pepper, to taste.
Transfer the macaroni and cheese to your prepared baking dish. Top with the set aside shredded cheddar cheese and mozzarella cheese.
Transfer to your preheated oven and bake for approximately 15 minutes, or until the cheese is warm and bubbly.