Really fix fish prompt.

The event wouldn't necessarily be triggered _after_ showing the
prompt, leading the subshell to sometimes pause before showing the
new prompt. Instead, copy the old function, replace it, and invoke
the copy from the new function. This should then preserve the users
prompt.

The subshell would also freeze if $PWD went away during a shell
operation. Fix this by making the prompt-code 'cd' back if 'pwd'
is blank (ie. invalid).