Another key feature of ZFS is the ability to send and receive datasets.  The send/receive functionality work much like a UFS filesystem dump, where all of the filesystem data are sent to the destination.  However you can only use send and receive to move data from a snapshot.

Let's assume you want to send the snapshot you've created above.  You could send it to a backup dataset on the same system with this command:

zfs send m10-1/development@20170531 | zfs recv backuppool/development@20170531

Note the pipe between the two commands -- the zfs send command simply creates a data stream, which can be manipulated like any other UNIX stream.  The zfs recv command takes that datastream and converts it back into a zfs snapshot on the target system.  

This means that you can easily store the output of a zfs send to a tape or other media for later retrieval with a command like this:

zfs send m10-1/development@20170531 > /dev/rmt0/backup20170531.zfs

and retrieve it like this:

dd if=/dev/rmt0/backup20170531.zfs | zfs recv somepool/development@20170531

Because we're just dealing with a data stream, you can also send it from one system to another, like this:

zfs send m10-1/development@20170531 | ssh backupbox "zfs recv backuppool/development@20170531"

To make this work, the user doing the sending must have the necessary permissions, but also should have key access to the receiving server, because there is no way to interactively enter a password using this method.