You can create snapshots through NFS by creating directories in the .zfs directory of each dataset. That special directory can be hidden or not (but still accessible).
ZFS is a hierarchical filesystem, just create individual datasets for each user within other datasets (e.g department/user1 department/user2 etc). They will inherit the properties or you can overwrite those too.
With clones you can save some disk space. If all your users need a initial set of files in their directories, put them in a dataset, snapshot it and clone for each user. You won't be able to delete the snapshot while there are clones depending on it.
Custom dataset properties and clones must be managed from the server side. As far as I know, there are proprietary plug-ins that export ZFS specifics to VMware and the like. There is not a distributed FS protocol that will allow that though. You could create a web front-end and let users manipulate them.