Get all logs in Tree Feller, and optimize performance

Tree Feller has been shown, both anecdotally and with timings, to put a strain on the server, and therefore is worthy of the effort of optimization.
Prior to this change, on jungle trees, Tree Feller would take around 20-40 milliseconds to process a Jungle Tree after the JIT kicked in, and around 15-25 milliseconds for a normal tree.

Additionally, logs would be left up in the air for jungle trees.

After this change, Tree Feller takes 2-5 milliseconds on normal trees, and 10-15 milliseconds on jungle trees, and no logs are left up in the air.

## Breakdown
First, we use a `LinkedHashSet` for `treeFellerBlocks` because we're checking contains much more than we add, and a consistent iteration order is still expected.

An `int[][]` of X/Z directions is created on static class initialization, representing a cylinder with radius of about 2 - the `(0,0)` center and all `(±2, ±2)` corners are omitted.

`handleBlock()` is changed to return a boolean, which is used for the sole purpose of switching between these two behaviors:
  1. **There is another log** above this log *(TRUNK)*  
       Only the flat cylinder in `directions` is searched.
  2. **There is not another log** above this log *(BRANCH AND TOP)*  
       The cylinder in `directions` is extended up and down by 1 block in the Y-axis, and the block below this log is checked as well.

Due to the fact that `directions` will catch all blocks on a red mushroom, the special method for it is eliminated.