I'm no stranger to coding, but I'm new to making games xD So take my advice for what it's worth.
If you have some animation where he's neither facing left or right, then disregard this paragraph xD Otherwise, first thing's first, you don't need a boolean for facing left and a boolean for facing right. If the boolean for facing left is false, it implies that the character is facing right.
1.) IMO, this problem is probably harder than it needs to be, because we're human and a computer is a silly stupid piece of junk. Theoretically, an object's speed at the peak of a jump is indeed 0. However, that's in real life. In virtual reality, "physics" is updated and looked at in certain time intervals.
For example, imagine that a ball is thrown up in the air and is accelerating downwards due to gravity by 10. If the ball was thrown upwards at an initial speed of 25, and we check the ball's speed every second, we'll see that the ball's speed is 25 at 0 seconds, 15 at 1 second, 5 at 2 seconds, -5 at 3 seconds.... We never find that the ball's speed is 0 from our checks, even though it has to have passed 0 between 2 and 3 seconds. I don't know how comprehensive the Box2D physics engine is, so this example might not apply.
Another problem is that the animation may happen so fast, that we just don't see it. I've noticed that in your code in snippetcode.png, your intent is that the peak animation should happen for 0.2 seconds. That's good.
However, there's one more problem that I'm spotting specifically in your code. Assuming that the computer does find that your character's y-speed is 0 and that he's not on the ground, your peak code is being overriden by another code. Since they're both "if" blocks, they're given equal consideration by the computer. Even though you specified that the character should show the falling animation after 0.2 seconds in the peak animation code, before that 0.2 seconds has elapsed, you already meet the requirements for the falling animation code: character is not on the ground, and character's y-speed is greater than 0. The computer will follow this instruction, even though it hasn't been 0.2 seconds yet. The result is that you get the falling animation MUCH sooner than you intended.
2.) The order that you tell the computer to check things matters.
In snippetcode4.png, the case that captaincomic suggested is in an "otherwise if" block. Since the first "if" block is for holding down the right key, the computer will follow the code for that block and disregard all other blocks that follow that say "otherwise if" and "otherwise". In other words, you'll never ever reach the code that causes the character's speed to be 0 if left and right are pressed together.
In your current code, if you jam down both the left and right keys, your character will run right. That's because the code for running right comes first.
Generally what you want to do is to tell the computer to look at the most specific cases first, so they have a chance of actually running. Your second problem can easily be solved at this point by just moving the code for left+right key pressed in the first "if" block, and have everything else follow in "otherwise if".