Implement insertLookupWithKey and rewrite insert functions.

I rewrote all insert functions in terms of more general `` insertLookupGen ``` and we gain a little more speed.
The new benchmarks(all upper bounds):
```
insert -- old
Mean execution time : 400.6 ns
Standard deviation  : 78.50 ns

insert -- new
Mean execution time : 304.7 ns
Standard deviation  : 30.69 ns
```
```
insertWith -- old
Mean execution time : 388.3 ns
Standard deviation  : 57.18 ns

insertWith -- new
Mean execution time : 328.6 ns
Standard deviation  : 66.93 ns
```

```
insertWithKey -- old
Mean execution time : 391.0 ns
Standard deviation  : 64.12 ns

insertWithKey -- new
Mean execution time : 320.8 ns
Standard deviation  : 57.22 ns
```

Also, if I did not mess the benchmarks again ``` insertLookupWithKey ``` is almost three times faster than the containers function.