Fill large stock pot with water, salt liberally and bring to a boil. Add pasta and cook according to package instructions. When done, reserve about 1 cup of the pasta water in a bowl or cup and set aside. Drain the pasta and allow to cool.
While pasta is cooking, heat a medium skillet over medium heat. Add ½ tablespoon butter and sauté asparagus about 5 minutes, until it turns bright green and it’s tender but isn’t yet browning. Set aside.
Using same sauté pan, melt 1 tablespoon butter over medium heat. Add shallots or onions and cook, stirring occasionally until alliums turn golden, about 20-25 minutes. Add another ½ tablespoon of butter if onions start to burn before they fully caramelize.
Now for the sauce: In the stock pot, melt 3 tablespoons butter over medium. Add flour, whisking constantly. After about 30 seconds, when a roux has formed, add the garlic, continuing to stir. Cook for 30 seconds more, taking care to not burn the garlic. Add the milk and cream and continue to stir, allowing the sauce to simmer and thicken. Then add cheese, nutmeg, and salt and pepper to taste. Be wary of adding any salt here, as ham (added next step) is very salty.
When cheese has melted, add pasta, asparagus, ham, peas and onion or shallot (as soon as they’re done). Give the pasta a good stir and add pasta water, ¼ cup at a time, until sauce is the desired consistency. I usually end up adding about ½ a cup. The sauce should thicken as it cools. Salt and pepper to taste and serve!