In the bowl of a stand mixer fitted with the dough hook, combine the bread flour, granulated sugar, instant yeast, and fine sea salt. Add the cold whole milk, cold water, and softened butter. Mix on low speed until the ingredients come together into a shaggy dough, then increase to medium speed and knead for about 4 minutes, just until the dough is smooth but not overly elastic. Shape the dough into a rough rectangle, wrap tightly in plastic wrap, and refrigerate for at least 8 hours or overnight.
Place the cold European style butter between two sheets of parchment paper. Using a rolling pin, pound and roll the butter into an even 7 by 7 inch square, working quickly so the butter stays cold. Trim the edges neatly with a bench scraper for a clean square, and fold any trimmings back into the block. Refrigerate the butter block until firm but still pliable, about 30 minutes.
On a lightly floured surface, roll the chilled dough into a 10 by 10 inch square. Place the cold butter block in the center of the dough, turned so it forms a diamond shape. Fold the corners of the dough up and over the butter block like an envelope, pinching the seams to fully seal the butter inside. Roll the dough out into a long rectangle, about 20 by 10 inches, keeping the edges as straight as you can. Fold the dough in thirds like a letter, bringing the bottom third up and the top third down. This is your first fold. Wrap the dough and refrigerate for 30 to 45 minutes. Repeat the rolling and letter fold two more times, chilling for 30 to 45 minutes between each fold, for a total of three folds. After the final fold, wrap the dough and refrigerate for at least 2 hours, or overnight.
On a floured surface, roll the laminated dough into a long rectangle about 24 by 10 inches and roughly 1/4 inch thick. Trim the edges with a bench scraper so you have clean, straight sides. Using a ruler and pastry wheel, mark the long edge every 5 inches, then cut the dough into triangles by connecting the marks. Cut a small 1/2 inch notch in the center of the short base of each triangle to help it curl as it rolls. Gently stretch each triangle lengthwise, then roll it up from the base to the tip, tucking the tip underneath the finished croissant. Curve the ends slightly inward to form the classic crescent shape, or leave them straight for a more rustic look. Place the shaped croissants on parchment lined baking sheets, spacing them a few inches apart.
Whisk together the egg and milk or cream to make the egg wash, and brush a thin layer over each croissant. Loosely cover the baking sheets with plastic wrap. Let the croissants proof at room temperature, ideally around 75 degrees F, for 2 to 3 hours, until they look puffy and jiggle slightly when the pan is nudged.
Preheat the oven to 400 degrees F. Brush the proofed croissants with a second light coat of egg wash. Bake for 18 to 22 minutes, rotating the pans halfway through, until the croissants are a deep golden brown and the layers are visibly crisp. Transfer to a wire rack and let cool for at least 15 minutes before serving.