Great, I'm glad the gravity issue is fixed at least.
As for the other two issues:
1: Not sure on this one just yet. I was looking at doing a constant movement speed myself a bit ago, but couldn't figure it out and didn't have the time to experiment. I'm sure there is a way though, I'm just not sure what it is, sorry!
2: If you are only moving horizontally, one thing you can try is checking to see if the velocity is going in the opposite direction of the direction you are wanting to move in, and if it is, setting the velocity to zero on the X axis and then setting the impulse. Something like this (untested):
if currentVelocity.x < 0 and direction.x < 0:
currentVelocity.x = 0
linear_velocity.x = 0
elif currentVelocity.x > 0 and direction.x > 0:
currentVelocity.x = 0
linear_velocity.x = 0
Something else you may want to look into is using a KinematicBody2D instead of a RigidBody2D for your character, unless you need something RigidBody2D specific. The KinematicBody2D node is much more easily controllable and would solve the first two issues relatively easily. There is also a documentation page with a simple character controller that you could use as a basis.