Coding techniques for distributed storage