Update:
Thank you @kkkkkkabc for providing a method to suggest and go off of. I wasn't able to use move_toward() because it's strictly for velocity.x & velocity.y, but I implemented your timer method around what my code would allow and what I'm trying to accomplish.
By doing more debugging, I have found that the culprit is that after my movement code, I wrote "else: velocity = Vector2.ZERO" because of course I want the player to stop moving when I'm not inputting a direction. But, as I was starting to suspect, it overrides when I set the velocity's value to anything else later down the page.
I commented out "else: velocity = Vector2.ZERO" and sure enough, the "blast attack" shot my character toward the appropriate direction, smoothly and without teleporting them ahead.
So I suppose now my course of action is to find a way to work around this oversight so that I can move the character and have them use their "blast attack" without velocity being set back to zero (among many other adjustments). Something I'm sure even a novice like me could figure out with a little thinking. Or at least I'd hope I'd be able to.
So just wanted to give that update since I promised @xyz I would let them know my hypothesis and debugging results when I made a breakthrough. (Thanks again to @xyz for your time, patience and help as usual) and thanks everyone in this forum who helped and offered their wisdom.