Did you notice that you got two different PIDs in the two tries?
Consider this: if you type a command like vi raven.txt,
then ps ax will display a line that shows a command of vi raven.txt.
Likewise, if you type a command like grep snappr,
then ps ax will display a line that shows a command of grep snappr.
And, if you pipe the output of that ps through grep snappr,
the grep will find the line that is describing itself.
So, if you type
$ ps ax | grep snappr | awk '{print $1}'
repeatedly, it will print a different number every time
(because it's printing the PID of grep,
and you get a new, unique grep process every time you run the command).
Finally, consider: the kill command cannot be executed until its argument(s) are known.
For its argument to be known, the $(ps ax | grep snappr | awk '{print $1}') pipeline
must have completed. This implies that the grep must have terminated1.
Therefore, the kill is being given the PID of the grep process,
but only after the grep process has terminated --
so, naturally, it reports "No such process".
Perhaps I should have mentioned that there is no snappr process running.
If there were, your first command would output two numbers: the PID of snappr,
and the PID of grep snappr.
Now, if snappr were running, your command might start running semi-correctly,
by which I mean it does what you want but also gives an error message.
If the snappr is running with PID 42097, and grep snappr runs with PID 70848,
then the kill command will be kill 42097 70858, which will kill the snappr
and get an error message from trying to kill the grep process that no longer exists.
You'll probably want to improve on this. My favorite way, which I invented 20 years ago,
it to change the grep to grep "[s]nappr", which will match snappr but will not match itself.
Another approach is to use pgrep rather than ps | grep.
1 Alternatively, the awk could finish if the grep merely closed its stdout.
This would be very unusual behavior for a *nix program.