Allow empty specifiers
Implement LegacyVersion which can support arbitrary versions
Rename identity to arbitrary and assure it operates on strings
Refactor normalization to handle LegacyVersion