New Coding Techniques For Distributed Storage Systems: Enabling Locality, Availability And Security