Breaking Changes
ValidationRule/PredicateValidationRule (a protocol pair with a sync Bool predicate and a fixed error message) is replaced by a single closure-backed ValidationRule struct. Rules now return ValidationError? directly, can compute their message dynamically from the rejected input, and may be async (e.g. to validate against the filesystem). NonEmptyRule becomes ValidationRule.nonEmpty(message:). Terminal.readText(_:) is now async.
Full Changelog: 0.1.1...0.2.0