add download(), parse() no longer uses callback