Abstract this a bit so we can support updating plugins from arbitrary zips