In short: don’t include ally-targeted healing skills in competitive games, in particular in team-based games like Overwatch, League of Legends, and such.
The main game-design problem with healing skills is that it’s hard to make the healing worthwhile but not too powerful to be problematic. If healing skills are too strong, you reach a point where everyone can pick a healer and then no one ever dies because the healing outpaces the incoming damage.
To deal with this, you basically have two options for designing heal skills: either you make healing strong but with a long cooldown, or you make healing weak but available often.
Weak healing skills then end up being mainly anti-poke healing. During a teamfight, weak healing is not very useful–as I said above, it has to be outdone fairly significantly by the enemy damage. So you could use weak healing as a form of player regeneration to force actual engagements as opposed to just endlessly poking down the enemy team, at the cost of having to actually select the healer instead of a better teamfight character. If that’s the design goal then weak healing is okay, but I prefer just giving characters other forms of regeneration (passive hp-over-time, or Overwatch’s health packs, etc.) instead. That means poke damage doesn’t become useless (it often feels futile or even outright counterproductive to deal poke damage to the enemy team in Overwatch, since you might just be charging their support ults).
Strong healing in theory can work, but I think there’s just a better mechanic to use: shields (temporary HP). Both shields and strong burst healing function largely similarly: they can be used to reduce poke damage (at the cost of opening a window where the shield/heal is on cooldown that the other team can in theory exploit), or to prevent burst damage from killing an ally. There are two main differences, and I think both of them point to shields being the better mechanic.
First, shields allow for more interesting play from both teams. Obviously, shields allow for the team playing against the shield to attempt to ignore it entirely. This is a lot more interesting than the “oh our first 200 damage just doesn’t count” that burst healing often turns into. On the other team, shields can be much more powerful than heals can: you don’t have the immortality problem, since shields can’t undo damage. This allows the team using the shield to enable aggressive positioning and maneuvers (like a Reinhardt or Riven charging in to the enemy team) that wouldn’t … or at least shouldn’t … be possible to do otherwise.
Shields also lead to a bit less snowbally gameplay, since after you win a fight you can’t just use the shields to heal up. In a game like League where things like turrets and neutral objectives deal damage to you, this means that how much you win a fight by is a big deal, since you might not be able to kill Baron if you don’t have enough health left, since you can’t heal it up. In general this is a desirable thing for team-based games.
League, of course, does a pretty good job of using shields instead of ally heals (and the two most notable ally-healers, Taric and Soraka, are both partially relics of old champion design besides). I don’t like how healing in Overwatch functions all that much. In my limited time playing Heroes of the Storm, healing was a giant mess there too, it was much too strong compared to player damage. Perhaps Blizz has fixed that since then.