In a heavy bottomed saucepan whisk together milk, sugar, cocoa powder, cornstarch and salt. Bring to a bowl over medium heat, whisking frequently until smooth. Whisk continuously as it comes to a boil and reduce heat. Cook gently on low for 1½-2 minutes. Remove from heat.
In a small bowl or measuring cup, whisk egg yolks until smooth. Slowly add ¼ cup of hot pudding mixture, whisking quickly. Add another ¼ cup while stirring continuously. Add the warmed egg yolk mixture back into the pot and whisk well. Return to heat.
Bring pudding back to a gentle boil over medium low heat and cook another 45-60 seconds. Whisk continuously until the mixture is smooth and slightly more thickened.
Remove from heat. Whisk in butter and vanilla until fully melted and smooth. Scrape the sides so every ingredient gets completely incorporated. Once smooth, strain the pudding into serving bowl to remove any bits of cooked egg. Cover immediately with plastic wrap so it is touching the surface. Allow to cool and chill for 3-4 hours before serving.