Heightmap probing:
    1. define the grid:
DONE        - from: x, y
DONE        - to: x, y
DONE        - step every: 5mm?
        - clearance height: Z1.5
        - start probing at: Z0.5
        - max negative z: Z-0.5 (when to fail probing)
        - z final safety height: Z15

DONE        - from and to can be filled from current project bounding box
DONE    2. probing
DONE        - machine moves at grid start position (x, y)
DONE            G0X0Y0
DONE        - gets down for initial probing
DONE            G38.2 Z-65 F100
DONE        - step back a bit (1mm, relative)
DONE            G91 G0 Z1
DONE        - seek again with lower feed rate
DONE            G38.2 Z-5 F5
DONE        - after first probe ever, this Z becomes reference 0
DONE            G10 L20 P0 Z0
DONE        - all subsequent probes will be relative to this
DONE        - for each probing location:
DONE            - G0 Z"clearance height"
DONE            - G0 XxxYyyy (next point location)
DONE            - G0 Z"start probing at"
DONE            - G38.2 Z-5 F5
DONE            - store Z offset and place it in the heightmap

        3. modify loaded program with heightmap data
        - foreach line in program
            - if line contains a Z coordinate, update the Z according to the X and Y
            - if line does not contain a Z coordinate, add a Z coordinate according to the X and Y

DONE -Let's get rid of the pesky inter-thread communication issue which is causing a lot of confusion.
DONE - Solve bug in which the probing data does not get rendered properly as it gets probed.

Bug: query coordinate systems after first z probe.
Refactor: see if we can unify machine state line handling and remove duplication

Edge finding
    - prerequisites
        - which edge to find? -X/+X/-Y/+Y
        - bit diameter used
        - put the  

Corner finding
    - which corner are we probing: up left, up right, bottom left, bottom right
    - need to know the bit diameter
    - use G38.2 to probe X edge and set that as current X - diam/2

Render arcs
Render quadratic splines
Render bezier splines
Synchronize executing program with render (show executed paths with different colors)
Add aggressive buffer execution policy and make it selectable.
Show a progress bar when executing programs.
Show a progress bar when probing.

DONE - Show program extents

DONE - Render program extents
DONE    - show a bounding box for the program extents
