Principles of Dependent Type Theory