I’m a Project Server 2013 user so unless they’ve changed core functionality in 2016 or Online, I think I can help with Part 1. When using % Complete to track task progress, MS Project assumes that all planned work happened as it is currently mapped in the schedule. If a task Start date is 12/1/17, the finish date is 1/15/18, and the task is marked 100% complete on 12/15/17, MS Project will basically convert all planned work (past, present, and future) to actual work across the entire task duration of 12/1/17 to 1/15/18. Thus you end up with actual hours applied to future days.
If the scheduling/leveling engines had planned work set up across individual days with values such a 4.3, 5.25, 3.8, and so on, those are the hours that will become the actual hours on those days.
Project does NOT look at the 100 hours of work on the task, recognize that your are marking it complete on 12/12/17, move the actual finish to 12/12/17, and then distribute the 100 hours from start to actual finish. It simply takes planned work and converts it to actual work which could be planned in the past, today, or in the future.
My recommendation, to avoid future actual work magically appearing in the schedule is to be cautious when completing tasks. If the task has a future finish date, change the task as necessary so the finish date is today and then complete the task.
This may also help with your Part 2 question.