Architecting Persistent Memory Systems