What can Snap! do that Scratch cannot?
The analogy is far from perfect, but Snap! is to Scratch as Mycroft is to Sherlock.

For me, the big advantage for Snap! is its provision of custom functions rather than just the custom blocks that Scratch 2 offers - Snap! functions return values that can be passed to other functions and so on, making it much easier to implement mathematical ideas and to build up programs by defining rules and relationships rather than sequences of steps. 

In Snap! functions are 'first class citizens', thus functions can be passed to other functions as parameters, or be stored in lists, or (pretty much) whatever, and so Snap! can be used as an introduction to functional programming.

In short, Snap! makes it easier to address much more theoretical CS than is convenient in Scratch, without introducing the need for text based programming. 

On the other hand... Snap! doesn't have the same rich range of support materials or vibrant support and sharing community that has made Scratch such a success.