I'm not sure how far you can usefully protect against an adversary with access to /proc/<pid>/mem.
You could punt on the problem entirely, and use ssh-agent. That could also allow users to take advantage of HSM integration, and absolves you from the UI for prompting for passphrases. Any adversary with access to the agent socket can still
sign things of course.
It might be worth looking at ssh-agent source code to see what precautions (if any) it takes with keys in memory - also any other well-known programs that deal with an unlocked private key in RAM, e.g. apache2 mod_ssl.
Aside: I don't agree with enforcing policy on administrators (i.e. "private keys must not be passwordless"). Firstly, you don't know the execution environment or trust model / threat model of all users. If you accept a private key on stdin then you have no way of knowing how well it was protected - it could have come from a gpg pipeline for example. Even when reading a key from disk, the key could be read from an encrypted filesystem, and the entire execution environment could be super-secure and isolated.
Perhaps more importantly, people who have a legitimate need for passwordless keys are just going to use a dumb passphrase like "abcd1234", so all you're doing is making them wrap your application in 'expect' scripts, while cursing under their breath.