I use libvirt/kvm/qemu. It works fine to do all the things mentioned like snapshots.