Verifying Higher-Order Imperative Programs with Higher-Order Separation Logic