Why Separation Logic Works