Great question! Here's my take:
Historically, programmers are used to memory being volatile. If you're building a data structure, like a hash table or a tree, you use locks to protect critical sections and make the code MT-safe, but if the power fails or the kernel crashes or the program crashes, the data structure is gone so the programmer doesn't usually worry about recovering from that.
For storage, of course, the situation is quite different. Programmers use techniques like logging, checksums, atomic pointer updates and so on to make sure they can maintain a consistent data structure in the face of failure. Database and file system programmers are particularly well-versed in this.
For persistent memory data structures, you have to decide the requirements of your application. Programs and systems can crash for many reasons, not just power failure. So how will you maintain consistency? Will you throw away the data structure like volatile memory? Will you have a way to detect inconsistencies? How do you decide if a particular byte of persistent memory is allocated or free and is your heap going to be consistent in the face of failure?
The PMDK libraries offer several different ways to solve these problems, each one targeted towards various use cases. And we're not done -- we're still improving performance, coming up with new APIs for new use cases, etc. So like I said before, use them or don't use them, but it is really up to your application requirements to decide what crash/powerfail cases you need to handle. Just remember that a power failure is not the only reason you might need to maintain consistency.
Hope that helps,
-andy