72728a5d45
Add `EvictRuntime` helper that removes + disposes a stale `ConcurrentDictionary` entry. Call it from `ReadSingleAsync`, `ReadGroupAsync`, and `WriteAsync` on non-zero libplctag status and transport exceptions so the next call for the same tag re-creates a fresh handle — mirroring the probe loop's recreate-on-failure pattern. Value-conversion exceptions (NotSupportedException, FormatException, InvalidCastException, OverflowException) are not transport faults and do not evict the handle. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>