Set aside 1/2 cup milk. Heat the remaining milk, cream, sugar, and salt in large saucepan set over medium heat until simmering, stirring occasionally to help dissolve the sugar.
Meanwhile, place the cornstarch in a large bowl and whisk in the reserved milk until smooth. Whisk in the egg yolks until smooth.
When the milk mixture reaches a simmer, remove from the heat and slowly pour into the yolk mixture while whisking constantly to prevent the eggs from scrambling (aka tempering).
Transfer the liquid back to the saucepan and place over medium heat. Whisk constantly until the pudding thickens (see notes) and a thermometer registers 180 degrees F, about 60-90 seconds. Remove from the heat and whisk in the butter and vanilla until shiny and smooth. Strain the pudding through a fine-mesh strainer set over a clean bowl.
Press plastic wrap directly against the surface of the hot pudding to prevent a skin from forming. Refrigerate until chilled, 3-4 hours or overnight. Before serving, re-whisk pudding until smooth, then divide into serving bowls.
Leftovers can be stored in an airtight container in the refrigerator for 5-7 days. Re-whisk before serving.
The vanilla pudding will continue to thicken as it chills, but you want it to be close to the desired thickness before removing it from the heat. The longer you whisk over heat, the thicker your pudding will be. This pudding is very nice served on its own. If you want to jazz it up, some nice toppings include whipped cream, chopped vanilla wafers, or fresh fruit. See post for additional topping suggestions.
For a less rich pudding, you can use all whole milk, or a combination of whole and 2% milk.