Place the flour, sugar, yeast, and salt in a large bowl and whisk together until combined.
Slice the butter into ⅛-inch thick slices and toss in the flour mixture to coat.
Add the milk and stir together until a stiff dough forms.
Wrap the dough tightly in plastic wrap and chill for 1 hour.
On a lightly floured surface, roll the dough into a long rectangle shape.
Fold it into thirds (like a letter), turn 90°, and repeat 3 to 5 more times, or until the dough has large streaks of butter in it but it is smooth and flat.
Wrap tightly and chill for 1 more hour, then divide the dough in half and roll each portion to a thickness of about ⅛-inch, in a long rectangle shape.
Cut the dough into long, skinny triangles.
Notch the wide end of each triangle with about a ½-inch cut, then roll from the wide end to the pointed end, tucking the point under the croissant.
Place on a parchment-lined baking sheet, cover loosely with plastic wrap, and allow to proof until doubled in size (1 to 2 hours).
Preheat the oven to 375°F, and gently brush the croissants with egg wash.
Bake for 15 to 20 minutes, or until puffed, golden brown, and flaky.