Add unbounded_cast as well as ETS-per-worker

This pull-request consists of two changes to sidejob.

First, this pull-request adds `sidejob:unbounded_cast` that provides the parallel worker capabilities of sidejob without the rate limiting (in cases where rate limiting overhead is too high).

Second, this pull-request changes sidejob from using a single ETS table with different keys representing each worker, to using a single ETS table per worker with static keys. The intention is to ensure that false lock conflicts never occurs.

Specifically, the original design used a concurrency optimized table hoping that accesses to disjoint keys would hit disjoint locks. In a concurrency optimized table, BEAM breaks a table up into multiple segments that each have their own lock. Keys mapping to different segments therefore hit different locks. Unfortunately, there is no guarantee that two keys map to separate, rather than the same, segment. Likewise, in R15 there are only 16 such locks per table; with R16 increasing this to 64 per tables.

This change allows sidejob to provide stronger guarantees about lock conflicts without worrying about internal BEAM details. The expense is additional memory overhead. A minor bonus is that this change allows the keys used to access the ETS tables to be static atoms. In BEAM, atoms bypass the normal hash logic when used as ETS keys.