Because of the money he got offered from another team. This is the same as the Murray story. We wanted him back but weren't going to overpay just to keep him.
We can't continue to keep developing these players and then just let them all go without having someone to replace them. Harris wasn't just a receiver, he was also one of the better special teamers and returners in the league (Look up his stats, outside of one year, he was always ranked highly).
We didn't do much to replace Murray and we didn't do much to replace our WR depth. Harris was with us since 2011, his experience with us would have been highly useful right now along with his return ability to shorten the field for our banged up offense.
You can say it's all hindsight, that's fine, but the fact remains that we continue to not replace players we let walk with a reliable option.