In a large mixing bowl or the bowl of a stand mixer, whisk together the warm milk, yeast and granulated sugar. Let sit for 5 minutes or until the mixture is foamy. (If the mixture doesn't foam, you will need to start over with fresh yeast.)
Add the flour, eggs and salt to the bowl and mix with the dough hook for one minute on low speed, until the ingredients are incorporated.
Scrape down the sides and bottom of the bowl and continue mixing at medium speed, for 2 minutes. The dough should be pulling away from the sides of the bowl.
Scrape dow the sides and bottom of the bowl. With the mixer on medium speed, begin adding the butter one tablespoon at a time. After the butter has been added, the dough will look very sticky and wet.
Continue mixing with the dough hook for another 5 minutes until the dough looks smooth and elastic. It should feel almost dry (not sticky) to the touch. If it is still sticky, continue mixing until it reaches the point where it feels soft and dry to the touch. (If you are using a hand mixer, you might need to finish the dough off by kneading by hand on a lightly floured surface.)
Lightly grease a large bowl and transfer the dough to the bowl. Cover the bowl with lightly greased plastic wrap and let rest in a warm place until doubled in size, about 60 to 90 minutes.
Line two large baking sheets with parchment paper. Set aside. Lightly flour a work surface.
Punch the dough down several times to release the air bubbles and then transfer to the floured surface. Roll the dough out to ⅜-inch thickness.
Use a donut cutter (or a 3 inch round cutter and ½ round cutter) to cut out the donuts. Gently gather the scraps and re-roll the dough as needed. You should have roughly 16 donuts and 16 donut holes.
Transfer the donuts to the prepared baking sheets leaving space in between to allow the donuts to rise. Loosely cover the baking sheet with greased plastic wrap and let rest until they have puffed up and are nearly double in size, about 30 minutes.