Begin by making the vanilla pudding filling. In a medium saucepan whisk together the granulated sugar, cornstarch, salt, milk, and egg yolks. Cook over medium-low heat, whisking occasionally (every minute or two), until the mixture is bubbling all throughout. Once bubbling, continue cooking for 1-2 additional minutes, whisking occasionally, and making sure that the pudding isn't burning on the bottom of the pan. At this point the pudding should be thickened but still pourable (it will thicken more as it cools).
Immediately whisk in butter and vanilla. If you notice any lumps, pour through a fine mesh sieve. Transfer to a bowl and cool at room temperature for about 30 minutes, then place a piece of plastic wrap directly over the pudding and refrigerate until chilled completely, at least 3 hours or even overnight.
Once the pudding has chilled: use a hand mixer or a stand mixer fitted with the whisk attachment to whip ½ cup chilled heavy cream and powdered sugar until stiff peaks form. Remove the pudding from the fridge. Vigorously stir or whisk the pudding until smooth. Using a rubber spatula, fold the whipped cream into the pudding until fully combined.
Line the bottom of an 8x8 square baking dish with a single layer of graham crackers, breaking some if necessary to fit. Add one third of the pudding mixture (I just eyeball it) and spread into an even layer. Repeat with another layer of graham crackers, half the remaining pudding, another layer of graham crackers, all the remaining pudding, then one final layer of graham crackers. Place in the refrigerator while you prepare the topping.
Add chocolate chips and remaining ¾ cup heavy cream to a microwave safe bowl. Heat in 20 second increments, stirring well in between, until smooth and fully melted. Cool at room temperature for 10 minutes. Pour over the top layer of graham crackers and smooth into an even layer. Refrigerate for 4-12 hours*, then serve.