There's been a proposal and a pull request to make the "no_log" keyword in Ansible, which hides output from remote syslog, also hide output and parameters from local callbacks (which would solve your display issue). We are likely to merge this soon.
As for being able to pass input into the shell module, this is not actually the case, thankfully!
shell: foo.sh < input.txt
And such is possible, as with other shell operators.
(You could also run an expect script, or wrap things in a script: call_program.sh script, and the text of the call_program.sh script wouldn't be seen, but it's true it can't be vault encrypted).