ConsoleInputHandler.Initialize() now checks Core.Headless and skips
starting the input thread entirely when stdin isn't a TTY, logging
instead. When not headless, it delegates the read loop to
ConsoleInputPump (Task 2) rather than running its own async void
loop with a two-AutoResetEvent handshake.
ReadLine() throws HeadlessConsoleInputException when headless, falls
back to a direct Console.ReadLine() during early startup or after the
pump loop has ended, and otherwise blocks on the pump.