Architectural techniques to enable reliable and scalable memory systems