prune: prune dependencies recursively
prune was not recursive when checking dependencies, for example when we have for example a shared part for openssl that is used only by a shared part for curl that is not used, we had to run prune twice, the first iteration would remove curl and only the second iteration would see that openssl is not used.
This prune in a loop until nothing is pruned by the last iteration. To support dry-run, we added a ignored_shared_parts parameter to ignore the parts that are supposed to be deleted.