Exploiting structure in mixed integer programming: Branching, cutting planes, and complexity