How to create file repository from which I can link files to other content types? I want to be able to "link" files to my content types. Two different nodes in two different content types can link to the same file, so I don't want use file upload field to avoid content duplication.

I also want to have publicly available "repository" where there is a list of all available files and for each file there is a list of articles / nodes to which this file is linked.

What is the simplest way to achieve this. Is there a reference field or something like that?

I would like to have little search field when linking files to content.
As said in the comments: 

Media module is just the thing you are looking for. We are also using it in our project, it's pretty good and solves all the problems you listed.

It's maybe also important to mention that this is going to be part of the core very soon (8.4.x).