How to display tags of content filtered by a different tag
You will need to use three views. 

The first view can be either a view of taxonomy terms (easy enough), or a view of your content type with a relationship, taxonomy terms on node. Use this path: work

If you select the second option you will get duplicate rows, and you will have to use aggregation. You will need three fields: tid (hidden), type (hidden and aggregation set to count), and term name (rewrite it to a link with this: work/[tid]).

The second view will have a path: work/% and will be a view of your content type. Add two relationships, one to taxonomy terms on node and select year, and another to taxonomy terms on node, and select project. Give them each a descriptive identifier. Now add a contextual filter: The tid of a taxonomy term, and select the relationship of the year taxonomy vocabulary. Now you will get a lot of duplicates. Again set aggregation on and this time you might have to add fields content type (hidden and aggregation count) as well as tid (hidden, relationship to year vocab, aggregation count). Add two hidden tid fields (for the link construction), one with year relationship, other with project.
Add your link field and rewrite as link like this: work/[tid]/[tid_1]

The third view is more of the same. It will have path of word/%/%. You will add one more relationship and contextual filter than you did for view 2.

In view 1 if you do it based on your content type then only years that are being used by your content will show. If you do it as a taxonomy view then all year terms will show, and depending on your content some of these term links will then navigate to empty views.

And when you build your views start off without any sorting on them as this will give initial issues with aggregation. You can add sorting back after you have a working solution.