Fix echo mode crash on `token add` (#3194)

diff --git a/lib/src/io.dart b/lib/src/io.dart
index b4898ff..641da73 100644
--- a/lib/src/io.dart
+++ b/lib/src/io.dart
@@ -8,6 +8,7 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:async/async.dart';
 import 'package:cli_util/cli_util.dart'
     show EnvironmentNotFoundException, applicationConfigHome;
 import 'package:http/http.dart' show ByteStream;
@@ -562,8 +563,8 @@
 })();
 
 /// A line-by-line stream of standard input.
-final Stream<String> _stdinLines =
-    ByteStream(stdin).toStringStream().transform(const LineSplitter());
+final StreamQueue<String> _stdinLines = StreamQueue(
+    ByteStream(stdin).toStringStream().transform(const LineSplitter()));
 
 /// Displays a message and reads a yes/no confirmation from the user.
 ///
@@ -580,7 +581,7 @@
 }
 
 /// Writes [prompt] and reads a line from stdin.
-Future<String> stdinPrompt(String prompt, {bool? echoMode}) {
+Future<String> stdinPrompt(String prompt, {bool? echoMode}) async {
   if (runningFromTest) {
     log.message(prompt);
   } else {
@@ -588,12 +589,16 @@
   }
   if (echoMode != null && stdin.hasTerminal) {
     final previousEchoMode = stdin.echoMode;
-    stdin.echoMode = echoMode;
-    return _stdinLines.first.whenComplete(() {
+    try {
+      stdin.echoMode = echoMode;
+      final result = await _stdinLines.next;
+      stdout.write('\n');
+      return result;
+    } finally {
       stdin.echoMode = previousEchoMode;
-    });
+    }
   } else {
-    return _stdinLines.first;
+    return await _stdinLines.next;
   }
 }