I don't like that new users are going to have to ignore a `Text` field.  Even worse, it has the same type as the next field, which should not be ignored.

I'd prefer if there was a new function which was sufficient for new users.  For example, 

```haskell
setPasswordHash :: Text -> user -> user
```

Then the library code would use `setPasswordHash` for new-style passwords and `setUserHashAndSalt` for old-style ones.  The default implementation of the latter could be `error`, while the former could be defined in terms of `setUserHashAndSalt` for backwards compatibility.