Specialize top level equals for Strings

This demonstrates a risk of this method - if other packages add an
extension which specialized `equals` for other Subject types, they won't
get picked up by `equals()` but would get picked up by `it()..equals()`.
diff --git a/pkgs/checks/lib/src/extensions/core.dart b/pkgs/checks/lib/src/extensions/core.dart
index 91a9730..1fc34be 100644
--- a/pkgs/checks/lib/src/extensions/core.dart
+++ b/pkgs/checks/lib/src/extensions/core.dart
@@ -101,7 +101,10 @@
 /// by operator `==`.
 ///
 /// This is a shortcut for `it<T>()..equals(expected)`.
-Condition<T> equals<T>(T expected) => it<T>()..equals(expected);
+Condition<T> equals<T>(T expected) => T == String
+    // String specializes `equals` with a better failure
+    ? ((it<String>()..equals(expected as String)) as Condition<T>)
+    : (it<T>()..equals(expected));
 
 extension BoolChecks on Subject<bool> {
   void isTrue() {